我用的是MS-SQL 的数据库管理系统今天遇到了以下的问题:我举个例子来说明一下大约是什么样的问题比如有一个表 汽车表(汽车ID,汽车名,汽车生产国家)
又有一个表 国家表(国家ID,国家名)这两个表之间有一个外键约束,国家表的国家ID 是 汽车表的外键
好,现在 删除 国家表中的一个数据 就会 引发一个异常,大约是说有外键约束不让删问题来了 那就是想删 国家表中的一个数据,怎么删?最好能同时说说 用SQL语句的删除方法 和用可视化操作的删除方法,,,谢谢大家
又有一个表 国家表(国家ID,国家名)这两个表之间有一个外键约束,国家表的国家ID 是 汽车表的外键
好,现在 删除 国家表中的一个数据 就会 引发一个异常,大约是说有外键约束不让删问题来了 那就是想删 国家表中的一个数据,怎么删?最好能同时说说 用SQL语句的删除方法 和用可视化操作的删除方法,,,谢谢大家
那样才可以删国家ID
delete from 国家表 where 国家ID="要删除的国家ID"
use dbTemp;
--首先在这个设计表的时候就有问题,因此我改了汽车表的一个字段 汽车生产国家 为 汽车生产城市
raiserror('正在创建表:国家表....',0,1)
CREATE TABLE 国家表(国家ID int CONSTRAINT PK_国家ID PRIMARY KEY,国家名 NVARCHAR(30))
go
raiserror('正在插入国家表三条记录....',0,1)
INSERT 国家表 SELECT 1,'香港'
UNION ALL SELECT 2,'中国'
UNION ALL SELECT 3,'美国'
go
raiserror('正在创建表:汽车表....',0,1)
CREATE TABLE 汽车表
(汽车ID int not null foreign key (汽车ID) references 国家表(国家ID),
汽车名 NVARCHAR(30),
汽车生产城市 Nvarchar(30)
)
go
raiserror('正在插入汽车表五条记录....',0,1)
INSERT 汽车表 SELECT 1,'捷达','香港'
UNION ALL SELECT 2,'大众','上海'
UNION ALL SELECT 3,'宝马','白宫'
UNION ALL SELECT 3,'奥迪','白宫'
UNION ALL SELECT 2,'现代','北京' go
raiserror('正在删除国家表中国家名为 中国 的记录....',0,1)
--创建一个存储过程删除
--删除开始
go
create procedure SP_Delete国家表记录
@国家名 nvarchar(30)
WITH ENCRYPTION
as
begin tran--启动事务
declare @ERROR int
set @ERROR=0
begin
declare @temp table
(
[汽车id] int,
[汽车名] varchar(30),
[汽车生产城市] varchar(30)
)
insert into @temp select * from 汽车表 where (汽车ID in( select 国家ID from 国家表 where 国家名=@国家名))
SET @ERROR =@ERROR +@@ERROR
IF (@ERROR <>0) GOTO EXT
declare @temp汽车id int,@temp汽车名 varchar(30),@temp汽车生产城市 varchar(30)
WHILE EXISTS(select * from @temp)
begin
SET ROWCOUNT 1
select @temp汽车id = [汽车id],@temp汽车名=[汽车名],@temp汽车生产城市=[汽车生产城市] from @temp
SET ROWCOUNT 0
delete from @temp where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
SET @ERROR =@ERROR +@@ERROR
IF (@ERROR <>0) GOTO EXT
print '临时表汽车名:----'+@temp汽车名
Delete from 汽车表 where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
SET @ERROR =@ERROR +@@ERROR
IF (@ERROR <>0) GOTO EXT
end
delete from 国家表 where 国家名 = @国家名
SET @ERROR =@ERROR +@@ERROR
IF (@ERROR <>0) GOTO EXT
end
--异常出口
EXT:
--判断执行状态
IF (@ERROR =0)
BEGIN
COMMIT
END
ELSE
ROLLBACK
go
--删除结束
--执行存储过程
exec SP_Delete国家表记录 '中国'
--删除数据库
go
use master
drop database dbTemp
go
--存储过程详解过程如下:
--必须先删除外键表:汽车表中所有 中国 的记录
--查找所有记录:
select * from 汽车表 where (汽车ID in( select 国家ID from 国家表 where 国家名='中国'))
--查找出有两条记录--不使用游标遍历这两条记录并删除
declare @temp table
(
[汽车id] int,
[汽车名] varchar(30),
[汽车生产城市] varchar(30)
)
insert into @temp select * from 汽车表 where (汽车ID in( select 国家ID from 国家表 where 国家名='中国'))
declare @temp汽车id int,@temp汽车名 varchar(30),@temp汽车生产城市 varchar(30)--测试用
--select * from @temp WHILE EXISTS(select * from @temp)
begin
SET ROWCOUNT 1
select @temp汽车id = [汽车id],@temp汽车名=[汽车名],@temp汽车生产城市=[汽车生产城市] from @temp
SET ROWCOUNT 0
--删除临时表记录
delete from @temp where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
print '临时表汽车名:----'+@temp汽车名
--删除汽车表记录
Delete from 汽车表 where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
end
--最后删除国家表记录
delete from 国家表 where 国家名 = '中国'
然后用update的方法就可以了 如果真的要删除 就需要验证其他表中这个表的主键做外键的表中没有他~