日期:2014-05-17  浏览次数:20544 次

关于MERGE,唯一索引问题,求解!

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

------解决方案--------------------
--确定目标表
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表里面从来没有数据,它是一次性操作,相当于一个事务,而不是一条一条操作,所以插入不成功
我这么理解的
------解决方案--------------------
MERGE INTO 插入不成功
------解决方案--------------------
merge 会忽略IGNORE_DUP_KEY 设置
练级丛书有说的,自己去看看
------解决方案--------------------
俺们一直使用
GUID
作为主键