SQL 怎样删除有外键约束的表
If exists
(
select * FROM sysobjects WHERE id = object_id(N'[dbo].[Students]') and OBJECTPROPERTY(id, N'IsUserTABLE') = 1
)
DROP TABLE [dbo].[Students];
提示无法删除,有外键约束。现在我想删除掉Students表,不管有没有外键约束,就算有,我也不用知道是那个表引用了它,约束名是什么。请问怎么用SQL语句实现呢?
先谢谢tanshuangcq的回答,只是,现在不知道哪个是外键表,或者有什么方法可以找到这个外键表呢?只能用SQL语句操作。
谢谢feixianxxx的回答。可能我没表达清楚,现在Students表对我来说完全是陌生的,我不知道里面有些什么列,更不知道那些列作了外键。我只想把这个表Drop掉。 展开
1、自动生成所有的DROP语句,将其中的MyDatabaseName替换成你的数据库名称:
SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';2、然后,在生成的代码前后添加下面设置FOREIGN_KEY_CHECKS变量的语句:
SET FOREIGN_KEY_CHECKS = 0
-- DROP语句
SET FOREIGN_KEY_CHECKS = 1;
扩展资料:
外键约束可双击关系线添加外键约束,外键约束有四种不同的选项:CASCADE, SET NULL, NO ACTION, RESTRICT。
1、CASCADE : 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。[ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。]
2、SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。[注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。]
3、NO ACTION: InnoDB拒绝删除或者更新父表。
4、RESTRICT: 拒绝删除或者更新父表。[指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。]
删除外键约束的表,首先要删除外键关联,然后才可以删除表。
如:
1、创建表author :
CREATE TABLE [dbo].[author]
([ID] [bigint] NOT NULL PRIMARY KEY,
[AuthorName] [char] (10) NULL,
[address] [char] (480) NULL,
[introduction] [ntext] NULL)
2、创建myBBS表:
CREATE TABLE [dbo].[myBBS] (
[ID] [bigint] IDENTITY (1, 1) NOT NULL,
[authorId] [bigint] NOT NULL,
[Title] [char] (40) NULL,
[Date_of_Created] [datetime] NULL,
[Abstract] [char] (480) NULL,
[Content] [ntext] NULL)
3、创建外键关系:
alter table dbo.mybbs add constraint FK_mybbs_author
foreign key (authorId)
references dbo.author([id]) ON UPDATE CASCADE ON DELETE CASCADE
4、在删除表前,要删除外键,语法如下:
alter table dbo.mybbs drop constraint FK_mybbs_author
5、然后再删除表:
drop table [dbo].[myBBS]
--查询一个表的所有外键:
SELECT 主键列ID=b.rkey
,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)
,外键表ID=b.fkeyid
,外键表名称=object_name(b.fkeyid)
,外键列ID=b.fkey
,外键列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid)
,级联更新=ObjectProperty(a.id,'CnstIsUpdateCascade')
,级联删除=ObjectProperty(a.id,'CnstIsDeleteCascade')
FROM sysobjects a
join sysforeignkeys b on a.id=b.constid
join sysobjects c on a.parent_obj=c.id
where a.xtype='f' AND c.xtype='U'
and object_name(b.rkeyid)='Students'
然后删除对应的外键~