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
USING ta AS A ON A.id=B.id
WHEN NOT MATCHED THEN
INSERT(id) values(A.id);
是返回多行而且有值重复,所以就提示错误,这没什么奇怪
CREATE UNIQUE INDEX idx_id ON tb(id) WITH(IGNORE_DUP_KEY=on)
--下面查询正常
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 行受影响)
*/
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 行受影响)
*/
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表里面从来没有数据,它是一次性操作,相当于一个事务,而不是一条一条操作,所以插入不成功
我这么理解的
练级丛书有说的,自己去看看
GUID
作为主键