我正在尝试从SQL表中删除外键,但由于某种原因它无法正常工作。
ALTER TABLE PETS
DROP FOREIGN KEY OWNER_NAME
但上述方法不起作用 - 我不明白。没有太多的语法可以搞砸,PETS
确实有一个外键OWNER_NAME
到另一个表。是什么给了什么?
宠物餐桌:
CREATE TABLE PETS
(
NAME VARCHAR(10) NOT NULL,
BIRTH_DATE DATE NOT NULL,
OWNER_NAME VARCHAR(10) NOT NULL,
PRIMARY KEY (NAME),
FOREIGN KEY (OWNER_NAME) REFERENCES OWNER ON DELETE CASCADE
);
错误回收:“OWNER_NAME”是未定义的名称。
答案 0 :(得分:3)
删除外键的语法是:
ALTER TABLE table
DROP FOREIGN KEY fk_name
在您的示例中(显示如何创建外键约束),OWNER_NAME
不外键的名称 - 这是PETS表中列的名称用于引用OWNER表。
因为您没有在CREATE TABLE语句中为约束指定特定名称,所以它将具有系统生成的名称,类似于SQL110213181225320。
您可以通过查看SYSCAT.REFERENCES:
找到约束的名称 SELECT constname, fk_colnames
FROM syscat.references
WHERE tabschema = 'YOURSCHEMA'
AND tabname = 'PETS'
然后,您可以使用此查询中相应的CONSTNAME值删除外键:
ALTER TABLE宠物 DROP FOREIGN KEY SQL110213181225320;
仅供参考,如果您希望外键约束具有更正常的名称,可以在CREATE TABLE语句中定义它:
CREATE TABLE PETS
(
NAME VARCHAR(10) NOT NULL,
BIRTH_DATE DATE NOT NULL,
OWNER_NAME VARCHAR(10) NOT NULL,
PRIMARY KEY (NAME),
CONSTRAINT FK_OWNER
FOREIGN KEY (OWNER_NAME)
REFERENCES OWNER
ON DELETE CASCADE
);
如果你这样做,那么你会看到针对SYSCAT.REFERENCES的查询将返回'FK_OWNER'。