Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 客户已下订单的删除时触发_Sql_Database_Oracle_Plsql_Triggers - Fatal编程技术网

Sql 客户已下订单的删除时触发

Sql 客户已下订单的删除时触发,sql,database,oracle,plsql,triggers,Sql,Database,Oracle,Plsql,Triggers,我正在为已删除的客户创建以前的客户表。 我想在从客户表中删除数据后创建一个触发器。 但是,我不希望所有客户都放在这个表中,只希望那些以前在系统中下过订单的客户。 我有两张桌子 Customer placed_order Customer_Id order_id first_name order_date last_name employee_ID address

我正在为已删除的客户创建以前的客户表。 我想在从客户表中删除数据后创建一个触发器。 但是,我不希望所有客户都放在这个表中,只希望那些以前在系统中下过订单的客户。 我有两张桌子

Customer                 placed_order
Customer_Id              order_id
first_name               order_date
last_name                employee_ID
address                  fk1_customer_id

如何才能只插入在“已下订单”表中有记录的客户?

类似的情况如何

CREATE OR REPLACE TRIGGER CUSTOMER_AD
  AFTER DELETE ON CUSTOMER
  REFERENCING OLD AS OLD
  FOR EACH ROW
DECLARE
  nPlaced_order_count  NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nPlaced_order_count
    FROM PLACED_ORDERS p
    WHERE p.FK1_CUSTOMER_ID = :OLD.CUSTOMER_ID;

  IF nPlaced_order_count > 0 THEN
    INSERT INTO PREVIOUS_CUSTOMER(whatever, whatever, whatever)
      VALUES(whatever, whatever, whatever);
  END IF;

  -- Now clean up the PLACED_ORDERS table

  DELETE FROM PLACED_ORDERS p
    WHERE p.FK1_CUSTOMER_ID = :OLD.CUSTOMER_ID;
END CUSTOMER_AD;
任何内容
替换为适合您的
上一个客户
表的列名和值

CREATE OR REPLACE TRIGGER trg_customer_delete
BEFORE DELETE ON customer
FOR EACH ROW
REFERENCING new AS new old AS old
AS
  cnt INTEGER;
BEGIN
    SELECT COUNT(*)
      INTO cnt
      FROM placed_order
     WHERE fk_customer_id = :old.customer_id

    IF cnt > 0 THEN
        INSERT INTO previous_customer
        (customer_id, first_name, last_name, address)
        VALUES
        (:old.customer_id, :old.first_name, :old.last_name, :old.address);
    END IF;
END;
/

分享和享受。

像这样的东西怎么样

CREATE OR REPLACE TRIGGER CUSTOMER_AD
  AFTER DELETE ON CUSTOMER
  REFERENCING OLD AS OLD
  FOR EACH ROW
DECLARE
  nPlaced_order_count  NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nPlaced_order_count
    FROM PLACED_ORDERS p
    WHERE p.FK1_CUSTOMER_ID = :OLD.CUSTOMER_ID;

  IF nPlaced_order_count > 0 THEN
    INSERT INTO PREVIOUS_CUSTOMER(whatever, whatever, whatever)
      VALUES(whatever, whatever, whatever);
  END IF;

  -- Now clean up the PLACED_ORDERS table

  DELETE FROM PLACED_ORDERS p
    WHERE p.FK1_CUSTOMER_ID = :OLD.CUSTOMER_ID;
END CUSTOMER_AD;
任何内容
替换为适合您的
上一个客户
表的列名和值

CREATE OR REPLACE TRIGGER trg_customer_delete
BEFORE DELETE ON customer
FOR EACH ROW
REFERENCING new AS new old AS old
AS
  cnt INTEGER;
BEGIN
    SELECT COUNT(*)
      INTO cnt
      FROM placed_order
     WHERE fk_customer_id = :old.customer_id

    IF cnt > 0 THEN
        INSERT INTO previous_customer
        (customer_id, first_name, last_name, address)
        VALUES
        (:old.customer_id, :old.first_name, :old.last_name, :old.address);
    END IF;
END;
/

共享和享受。

首先,您必须在
下单
fk1.customer\u id
列上指定在删除时层叠的约束。只需更改该列上的外键约束

试试这个:

ALTER TABLE placed_order
MODIFY CONSTRAINT fk1_fk_customer_id
FOREIGN KEY (fk1_customer_id) REFERENCES customer(customer_id)
ON DELETE CASCADE;
接下来,您需要在客户上设置一个“删除前
”触发器,该触发器将对那些在
下单
表中有条目的客户进行审核

CREATE OR REPLACE TRIGGER trg_customer_delete
BEFORE DELETE ON customer
FOR EACH ROW
REFERENCING new AS new old AS old
AS
  cnt INTEGER;
BEGIN
    SELECT COUNT(*)
      INTO cnt
      FROM placed_order
     WHERE fk_customer_id = :old.customer_id

    IF cnt > 0 THEN
        INSERT INTO previous_customer
        (customer_id, first_name, last_name, address)
        VALUES
        (:old.customer_id, :old.first_name, :old.last_name, :old.address);
    END IF;
END;
/

首先,您必须在
placed\u order
fk1.customer\u id
列上指定要在删除时级联的约束。只需更改该列上的外键约束

试试这个:

ALTER TABLE placed_order
MODIFY CONSTRAINT fk1_fk_customer_id
FOREIGN KEY (fk1_customer_id) REFERENCES customer(customer_id)
ON DELETE CASCADE;
接下来,您需要在客户上设置一个“删除前
”触发器,该触发器将对那些在
下单
表中有条目的客户进行审核

CREATE OR REPLACE TRIGGER trg_customer_delete
BEFORE DELETE ON customer
FOR EACH ROW
REFERENCING new AS new old AS old
AS
  cnt INTEGER;
BEGIN
    SELECT COUNT(*)
      INTO cnt
      FROM placed_order
     WHERE fk_customer_id = :old.customer_id

    IF cnt > 0 THEN
        INSERT INTO previous_customer
        (customer_id, first_name, last_name, address)
        VALUES
        (:old.customer_id, :old.first_name, :old.last_name, :old.address);
    END IF;
END;
/

您想如何处理
placed\u order
表中的记录?它们应该被删除还是设置为null?嗯,好的,它们也会从数据库中删除。我有一个正在运行的过程,它当前会从我使用的两个表中删除。你真的不需要一个过程来完成这项工作。只要一个外键在DELETE CASCADE上带有
就可以了。嗨,是的,我知道,但是我已经有一个程序在运行,所以我们可以使用它,你知道触发器是什么吗?你想对
下订单的
表中的记录做什么?它们应该被删除还是设置为null?嗯,好的,它们也会从数据库中删除。我有一个正在运行的过程,它当前会从我使用的两个表中删除。你真的不需要一个过程来完成这项工作。只要一个外键,在DELETE CASCADE上加上
就可以了。嗨,是的,我知道,但我已经有一个程序在运行,所以不妨使用它,你对触发器有什么想法吗?这看起来很完美,只需要一个问题:引用“老如旧”意味着什么?@RichardClare-这意味着什么“在执行删除之前引用值时使用旧名称”。我可以说类似于
将旧名称引用为O
,然后使用,例如
:O.CUSTOMER\u ID
(感谢您的更正/添加冒号,@AlexPoole).这似乎很完美,只有一个问题:引用old as old意味着什么?@RichardClare-它的意思是“在引用值时使用old的名称,就像执行删除之前一样”。我可以说类似于
引用old as O
,然后使用,例如
:O.CUSTOMER\u ID
(感谢您的更正/添加冒号,@AlexPoole)。