考虑到该表中已有主键,如何插入表中?

时间:2014-09-18 23:51:59

标签: sql sql-server sql-server-2012

我有两个表A和B,需要从A到B插入记录(少数列不是全部)。 我当然可以这样做:

INSERT INTO B (col2)
    SELECT DISTINCT col2
    FROM A

但是,表B中的Col1(名为ID)的类型为INT,因此导致此错误:

  

Msg 515,Level 16,State 2,Line 1
  无法将值NULL插入列'ID',表'MyDB.dbo.Visitor';列不允许空值。 INSERT失败。

如何让SQL Server忽略此列并只插入我需要的数据?

感谢。

5 个答案:

答案 0 :(得分:0)

主键必须满足两个条件:

  1. 表中必须是唯一的(即表中的任何行都可以通过其主键标识),并且
  2. 作为主键一部分的字段不能是NULL

    这是因为在主键中允许NULL值会使主键的唯一性无法保持,因为NULL值不等于任何其他值,包括其他NULL

  3. 引自here

      

    唯一键约束在实践中并不意味着NOT NULL约束。由于NULL不是实际值(它表示缺少值),因此当比较两行并且列中的两行都有NULL时,列值不会被视为相等。因此,为了使唯一键能够唯一标识表格中的每一行,不得使用NULL

答案 1 :(得分:0)

假设您没有在B:

中插入重复项,这应该可行
INSERT INTO B (col2)
SELECT DISTINCT col2
FROM A
WHERE col2 IS NOT NULL

答案 2 :(得分:0)

将表B中的ID列设置为"自动递增"。

答案 3 :(得分:0)

如果您将ID列定义为IDENTITY

,SQL Server将自动为ID列提供唯一值

在您的情况下,您可以计算IDENTITY列的最大值,并从超过该最大值的值开始{{1}}。

有关此类代码,请参阅SQL Server, How to set auto increment after creating a table without data loss?的已接受答案。

答案 4 :(得分:-1)

您需要在两个表之间创建关系并执行更新语句。

更新表b从表a中设置valueb = valuea,其中a.id = b.id

你还需要重新思考一下你的设计。