ON DELETE CASCADE是什么数据库里面怎么设置

ON DELETE CASCADE是什么数据库里面怎么设置,第1张

是级联删除。

为表order_items(Product_id)添加一个外键Order_Items_Product_ID_FK

级联product_Information(product_id),加上ON DELETE CASCADE后,如果主表order_items删除 一条记录,那么product_Information中对应的关联 的数据也跟着删除

数据库里面怎么设置:

>

这样的 *** 作明显违法了当初如此进行这些表关系设计的初衷。

cascade用处在于,你删除某条记录时,如果主键值被删除,那么级联删除子表的相关数据。

不适用于你现在的情况:删除主表!!!

还是建议你想好,为什么要删除此表。

安全起见的话,先删除各个外键,再删除主表;建议删除主表前,先备份(以免后悔)

Oracle、DB2、SQL Server 都支持。

MySQL 触发器不支持 。

-- 创建测试主表 ID 是主键

CREATE TABLE test_main (

id INT NOT NULL,

value VARCHAR(10),

PRIMARY KEY(id)

);

-- 创建测试子表

CREATE TABLE test_sub (

id INT NOT NULL,

main_id INT ,

value VARCHAR(10),

PRIMARY KEY(id)

);

-- 插入测试主表数据

INSERT INTO test_main(id, value) VALUES (1, 'ONE');

INSERT INTO test_main(id, value) VALUES (2, 'TWO');

-- 插入测试子表数据

INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');

INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');

Oracle

-- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)

ALTER TABLE test_sub

ADD CONSTRAINT main_id_cons

FOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;

CREATE OR REPLACE TRIGGER BeforeDeleteTest_sub

BEFORE DELETE ON test_sub

FOR EACH ROW

BEGIN

dbms_outputput_line('BEFORE DELETE test_sub');

dbms_outputput_line('Old value = ' || :oldvalue );

END;

/

SQL> set serveroutput on

SQL> -- 测试删除主表数据 将成功地执行

SQL> DELETE

2 TEST_MAIN

3 WHERE

4 ID = 1;

BEFORE DELETE test_sub

Old value = ONEONE

已删除 1 行。

SQL>

SQL> -- 测试检索子表,应该只有一条 main_id = 2 的数据

SQL> SELECT

2

3 FROM

4 test_sub;

ID MAIN_ID VALUE

---------- ---------- --------------------

2 2 TWOTWO

DB2

-- 日志信息表

CREATE TABLE log_table ( log_data varchar(50));

-- 触发器

CREATE TRIGGER AfterDeleteTest_sub

AFTER DELETE ON test_sub

REFERENCING OLD AS O

FOR EACH ROW

BEGIN

INSERT INTO log_table VALUES ( 'Delete value = ' || Ovalue );

END

@

-- 外键约束

ALTER TABLE test_sub

ADD CONSTRAINT main_id_cons

FOREIGN KEY (main_id)

REFERENCES test_main ON DELETE CASCADE;

-- 测试删除主表数据 将成功地执行

DELETE

TEST_MAIN

WHERE

ID = 1;

-- 检查日志信息表,看看触发器是否被触发

db2 => SELECT FROM log_table;

LOG_DATA

--------------------------------------------------

Delete value = ONEONE

1 条记录已选择。

-- 测试检索子表,应该只有一条 main_id = 2 的数据

db2 => SELECT FROM test_sub;

ID MAIN_ID VALUE

----------- ----------- ----------

2 2 TWOTWO

1 条记录已选择。

SQL Server

-- 触发器

CREATE TRIGGER AfterDeleteTest_sub

ON Test_sub

FOR DELETE

AS

DECLARE

@OldValue VARCHAR(10);

BEGIN

PRINT('AFTER DELETE');

SELECT @OldValue = value FROM deleted;

PRINT('Old Value = ' + @OldValue);

END;

go

-- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)

ALTER TABLE test_sub

ADD CONSTRAINT main_id_cons

FOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;

GO

-- 测试删除主表数据 将成功地执行

1> DELETE TEST_MAIN WHERE ID = 1;

2> GO

AFTER DELETE

Old Value = ONEONE

(1 行受影响)

-- 测试检索子表,应该只有一条 main_id = 2 的数据

SELECT

FROM

test_sub;

go

(1 行受影响)

id main_id value

----------- ----------- ----------

2 2 TWOTWO

(1 行受影响)

MySQL

-- 日志信息表

CREATE TABLE log_table ( log_data varchar(50));

-- 触发器

DELIMITER //

CREATE TRIGGER BeforeDeleteTest_sub

BEFORE DELETE ON Test_sub

FOR EACH ROW

BEGIN

INSERT INTO log_table VALUES ( CONCAT('Delete Value = ', oldValue) );

END;

//

DELIMITER ;

-- 外键

ALTER TABLE test_sub ADD CONSTRAINT fk_main_id_cons

FOREIGN KEY (main_id) REFERENCES test_main(id)

ON DELETE CASCADE;

-- 删除

DELETE FROM test_main WHERE id = 1;

-- 检查日志信息表,看看触发器是否被触发

mysql> SELECT FROM log_table;

Empty set (000 sec)

MySQL 外键级联删除, 不会触发 子表的触发器

-- 测试检索子表,应该只有一条 main_id = 2 的数据

mysql> SELECT FROM test_sub;

+----+---------+--------+

| id | main_id | value |

+----+---------+--------+

| 2 | 2 | TWOTWO |

+----+---------+--------+

1 row in set (000 sec)

>

级联更新或者级联删除是定义在表里面的,而不是在执行某个sql *** 作的时候定义的!\x0d\例如:有个a表中的studentID外键引用了你现在的student表的uid字段,那么在表a上就可以用\x0d\alter table a\x0d\ add constraint FK_OA_REDB foreign key (studentID)\x0d\ references student(uid)\x0d\ on update cascade on delete cascade\x0d\go\x0d\然后你在 student删除一条记录的时候 a表中对应uid的记录就会同时被删除了

fall 是很一般的倒下或倾倒。

而cascade 则表示像瀑布一样倾泻而下。如:The price of a television set cascaded to 320 pounds last week 译文是:电视机价格上周暴跌到每台320镑。

Hope That Help!

以上就是关于ON DELETE CASCADE是什么数据库里面怎么设置全部的内容,包括:ON DELETE CASCADE是什么数据库里面怎么设置、数据库删除列时,cascade和restrict的问题、mysql数据库,我想删除一张表,这张表的主键又作为其它多张表的外键,InnoDB,且设置了删除cascade。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9375493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存