IF OBJECT_ID('ta') IS NOT NULL
    DROP TABLE ta
CREATE TABLE ta(id int)INSERT INTO ta
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 1 IF OBJECT_ID('tb') IS NOT NULL
    DROP TABLE tb
CREATE TABLE tb(id int)--唯一索引,忽略重复
CREATE UNIQUE INDEX idx_id ON tb(id) WITH(IGNORE_DUP_KEY=on)MERGE INTO TB AS B
USING ta AS A ON A.id=B.id
WHEN NOT MATCHED THEN
INSERT(id) values(A.id);
--这里直接报错了,很诧异,为什么?/*
(5 行受影响)
消息 2601,级别 14,状态 1,第 19 行
不能在具有唯一索引 'idx_id' 的对象 'dbo.tb' 中插入重复键的行。
语句已终止。
*/
DROP TABLE ta
DROP TABLE TB
merge唯一索引insert

解决方案 »

  1.   

    TB表已经创建唯一索引,而下面语句
    MERGE INTO TB AS B
    USING ta AS A ON A.id=B.id
    WHEN NOT MATCHED THEN
    INSERT(id) values(A.id);
    是返回多行而且有值重复,所以就提示错误,这没什么奇怪
      

  2.   


    CREATE UNIQUE INDEX idx_id ON tb(id) WITH(IGNORE_DUP_KEY=on)
      

  3.   


    --下面查询正常
    IF OBJECT_ID('ta') IS NOT NULL
        DROP TABLE ta
    CREATE TABLE ta(id int)INSERT INTO ta
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 IF OBJECT_ID('tb') IS NOT NULL
        DROP TABLE tb
    CREATE TABLE tb(id int)--唯一索引,忽略重复
    CREATE UNIQUE INDEX idx_id ON tb(id) WITH(IGNORE_DUP_KEY=on)INSERT TB(id) SELECT id FROM ta
    DROP TABLE ta
    DROP TABLE TBgo/*(5 行受影响)
    已忽略重复的键。(1 行受影响)
    */
      

  4.   

    --下面查询正常
    IF OBJECT_ID('tb') IS NOT NULL
        DROP TABLE tb
    CREATE TABLE tb(id int)--唯一索引,忽略重复
    CREATE UNIQUE INDEX idx_id ON tb(id) WITH(IGNORE_DUP_KEY=on)
    INSERT TB(id) VALUES(1)
    INSERT TB(id) VALUES(1)
    INSERT TB(id) VALUES(1)
    INSERT TB(id) VALUES(1)
    INSERT TB(id) VALUES(1)
    DROP TABLE TBGO
    /*(1 行受影响)
    已忽略重复的键。(0 行受影响)
    已忽略重复的键。(0 行受影响)
    已忽略重复的键。(0 行受影响)
    已忽略重复的键。(0 行受影响)
    */
      

  5.   

    --确定目标表
    MERGE INTO TB AS B
    --从数据源查找编码相同的id
    USING ta AS A ON A.id=B.id
    --如果目标表中不存在,则从数据源插入目标表
    WHEN NOT MATCHED THEN
    INSERT(id) values(A.id);这里为什么插入不成功,是因为TB表里面从来没有数据,它是一次性操作,相当于一个事务,而不是一条一条操作,所以插入不成功
    我这么理解的
      

  6.   

    merge 会忽略IGNORE_DUP_KEY 设置
    练级丛书有说的,自己去看看
      

  7.   

    俺们一直使用
    GUID
    作为主键