0

如何编写序列并在插入表时触发将检查 ID 属性(和 INTEGER)是否为空。

如果为空,则应从 1 向上递增,检查值本身是否已经是主键,如果不是,则应将其用作要插入的主键。

否则,如果 id 不为空,则应更新给定 id 处的行

到目前为止我有这个,但不确定

CREATE SEQUENCE create_student_id
START WITH 1
INCREMENT BY 1;

CREATE OR REPLACE TRIGGER new_student_id BEFORE
INSERT ON orders
    IF StudentID == null
    THEN
        FOR EACH ROW BEGIN
            :new.StudentID := create_student_id.nextval;
    END IF
--Need to update the table otherwise
    END;
4

1 回答 1

0

您是否尝试实现 upsert 方法?在我看来,在触发器内进行索引验证就像是在替换数据库的内部工作。但是出于好奇的目的,下面的代码片段展示了这个想法,但在并发情况下不起作用。

CREATE OR REPLACE TRIGGER new_student_id 
  BEFORE INSERT ON orders
FOR EACH ROW BEGIN
  DECLARE count 1 INT;
  IF StudentID == null THEN        
    WHILE (count != 0) LOOP 
      :new.StudentID := create_student_id.nextval;
      SELECT COUNT(1) INTO COUNT FROM orders WHERE StudentID = :new.StudentID
    END LOOP;
    -- If we got to this place the StudentID is now an usable key index 
  END IF;

--Need to update the table otherwise
END;
于 2020-11-24T19:28:38.370 回答