我用的是MS-SQL 的数据库管理系统今天遇到了以下的问题:我举个例子来说明一下大约是什么样的问题比如有一个表  汽车表(汽车ID,汽车名,汽车生产国家)
  又有一个表  国家表(国家ID,国家名)这两个表之间有一个外键约束,国家表的国家ID 是 汽车表的外键
好,现在 删除 国家表中的一个数据 就会 引发一个异常,大约是说有外键约束不让删问题来了 那就是想删 国家表中的一个数据,怎么删?最好能同时说说 用SQL语句的删除方法 和用可视化操作的删除方法,,,谢谢大家

解决方案 »

  1.   

    要先把汽车表里的对应国家ID的全删了
    那样才可以删国家ID
      

  2.   

    delete from 汽车表 where 汽车生产国家="要删除的国家ID"
    delete from 国家表 where 国家ID="要删除的国家ID"
      

  3.   

    create database dbTemp;
    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 国家名 = '中国'
      

  4.   

    基本数据的删除建议楼主添加一个del的字段 
    然后用update的方法就可以了 如果真的要删除 就需要验证其他表中这个表的主键做外键的表中没有他~