是级联删除。
为表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。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)