2013-10-22 155 views
2

我有以下表格:SQL ALTER TABLE ON DELETE CASCADE

CREATE TABLE BOOK_AUTHORS 
(Book_id CHAR(20) NOT NULL, 
AuthorName VARCHAR(30) NOT NULL, 
PRIMARY KEY (Book_id, AuthorName), 
FOREIGN KEY (Book_id) REFERENCES BOOK (Book_id)); 

CREATE TABLE BOOK_COPIES 
(Book_id CHAR(20) NOT NULL, 
Branch_id CHAR(20) NOT NULL, 
No_of_copies NUMBER, 
PRIMARY KEY (Book_id, Branch_id), 
FOREIGN KEY (Book_id) REFERENCES BOOK (Book_id), 
FOREIGN KEY (Branch_id) REFERENCES LIBRARY_BRANCH (Branch_id)); 

我想ON DELETE CASCADE约束添加到他们两个:

我第一次尝试它说,它的工作。这个文件看起来像:

ALTER TABLE "BOOK_AUTHORS" 
ADD CONSTRAINT "fk_test" 
FOREIGN KEY ("Book_id") 
REFERENCES "BOOK" ("Book_id") 
ON DELETE CASCADE; 

然后我去通过,并在第二个表由两个独立的表的两个外键:

ALTER TABLE "BOOK_COPIES" 
ADD CONSTRAINT "fk_test1" 
FOREIGN KEY ("Book_id") 
REFERENCES "BOOK" ("Book_id") 
ON DELETE CASCADE; 

ALTER TABLE "BOOK_COPIES" 
ADD CONSTRAINT "fk_test2" 
FOREIGN KEY ("Branch_id") 
REFERENCES "LIBRARY_BRANCH" ("Branch_id") 
ON DELETE CASCADE; 

然而,在这样做,我得到了错误

“Book_id” 无效的标识符

然后

“Branch_id” 无效的标识符

我不知道我做错了什么。然后,我又回去做了第一个更改表(我原本以为工作的那个),它给了我同样的错误信息("Book_id" invalid identifier)。有人可以帮我添加这些限制吗?我还有其他五个表来添加这些约束。

+0

确表'LIBRARY_BRANCH'有字段'Branch_id'? –

+0

是的,这是我的LIBRARY_BRANCH表 CREATE TABLE LIBRARY_BRANCH (Branch_id CHAR(20)NOT NULL, Branch_name VARCHAR(50), 地址VARCHAR(100), PRIMARY KEY(Branch_id)); – Anon1234567890

+0

你是如何制作副本的?也许副本已经设置了外键? –

回答

0

认沽双引号(“)。在你的表和列名

我添加表 ”书“ 和表 ”LIBRARY_BRANCH“:

CREATE TABLE "BOOK" 
("Book_id" CHAR(20) NOT NULL, 
"BookName" VARCHAR(30) NOT NULL, 
PRIMARY KEY ("Book_id")); 

CREATE TABLE "BOOK_AUTHORS" 
("Book_id" CHAR(20) NOT NULL, 
"AuthorName" VARCHAR(30) NOT NULL, 
PRIMARY KEY ("Book_id", "AuthorName")); 

CREATE TABLE "LIBRARY_BRANCH" 
("Branch_id" CHAR(20) NOT NULL, 
"Branch_name" VARCHAR(50), 
"Address" VARCHAR(100), 
PRIMARY KEY ("Branch_id")); 

CREATE TABLE "BOOK_COPIES" 
("Book_id" CHAR(20) NOT NULL, 
"Branch_id" CHAR(20) NOT NULL, 
"No_of_copies" NUMBER, 
PRIMARY KEY ("Book_id", "Branch_id")); 


ALTER TABLE "BOOK_AUTHORS" 
ADD CONSTRAINT "fk_test" 
FOREIGN KEY ("Book_id") 
REFERENCES "BOOK" ("Book_id") 
ON DELETE CASCADE; 

ALTER TABLE "BOOK_COPIES" 
ADD CONSTRAINT "fk_test1" 
FOREIGN KEY ("Book_id") 
REFERENCES "BOOK" ("Book_id") 
ON DELETE CASCADE; 

ALTER TABLE "BOOK_COPIES" 
ADD CONSTRAINT "fk_test2" 
FOREIGN KEY ("Branch_id") 
REFERENCES "LIBRARY_BRANCH" ("Branch_id") 
ON DELETE CASCADE; 

sqlfiddle demo

3

如果你把双引用围绕你的标识符(就像你在

ALTER TABLE "BOOK_COPIES" 
ADD CONSTRAINT "fk_test1" 
FOREIGN KEY ("Book_id") 
REFERENCES "BOOK" ("Book_id") 
ON DELETE CASCADE; 

)您的标识符(例如本例中的“Book_id”)区分大小写。

因此,无论你必须改变你的表定义,并重新命名列“Book_id”或(更优选恕我直言)刚刚获得在你的约束定义去掉双引号:

ALTER TABLE BOOK_COPIES 
ADD CONSTRAINT fk_test1 
FOREIGN KEY (Book_id) 
REFERENCES BOOK (Book_id) 
ON DELETE CASCADE; 
1

第一所有让我明白一件事情,你不能添加删除层叠到一个已经存在的外键约束,如docs所示,你只能改变它的状态,这意味着启用或禁用,如果你需要添加然后先删除约束。这个问题被问及两次,仍然重复,请管理员有一个这样的一瞥。这里是已经解决了你的问题的链接。 first,secondthird,谁知道在删除级联时询问了多少个问题。