oracle 防止PostgreSQL中的外键被删除

qaxu7uf2  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(96)

在PostgreSQL上,如何防止外键的值被删除,即使在其引用的主键被删除之后?

即使我从bank_account表中删除了account_number主键,我仍然希望将account_number外键保留在payment_history表中,如下图所示:


的数据
如何防止FK Account_Numberpayment_history表中被删除,即使我在bank_account表中删除了它的主键?请帮帮我谢谢你,谢谢
下面是我用来创建这两个表的代码:

create table bank_account
(
    account_number int primary key, 
    bank_name varchar(40)
);

create table payment_history
(
    payment_history_id int primary key, 
    account_number int, 
    amount_paid decimal, 
    date date, 

    constraint account_number_fk 
        foreign key(account_number) references bank_account(account_number)
);

字符串

yeotifhr

yeotifhr1#

外键总是有确保两个表之间的完整性的任务。默认情况下,PostgreSQL将抛出一个错误,如果定义了外键,并删除一个键元素。或者,您可以将外键设置为null。由于您不希望任何一个操作,也不希望确保两个表之间的关系仍然存在,因此此时不希望使用外键定义的任何属性。因此,解决方案是省略外键。这对于历史数据来说是非常好的,并且不反对标准化本身。
但是,您可以定义一个函数来触发插入,从而确保至少在插入到历史记录中时,银行帐户存在。如果这也不能满足您的愿望/要求,您必须以某种方式创建数据完整性本身。

CREATE OR REPLACE FUNCTION check_account_number_exists()
RETURNS TRIGGER AS $$
BEGIN
   -- If the account number doesn't exist in bank_account, raise an exception.
   IF NOT EXISTS (SELECT 1 FROM bank_account WHERE account_number = NEW.account_number) THEN
      RAISE EXCEPTION 'account_number % does not exist in bank_account', NEW.account_number;
   END IF;

   -- If the account number exists, proceed with the insertion.
   RETURN NEW;
END;
$$ LANGUAGE plpgsql;

字符串
还有扳机

CREATE TRIGGER payment_history_before_insert
BEFORE INSERT ON payment_history
FOR EACH ROW
EXECUTE FUNCTION check_account_number_exists();

相关问题