Violation of PRIMARY KEY constraint. В чем проблема

Rivkin Dmitry
Дата: 27.01.2009 10:35:21
Хочу слить две таблицы Cars и CarsDeleted. В Cars PRIMARY KEY - единственное поле CarNumber

Пишу:

INSERT INTO Cars ([CarNumber], <список полей>) 
SELECT [CarNumber], <список полей>
FROM CarsDeleted (HOLDLOCK TABLOCKX)
WHERE CarNumber NOT IN (SELECT CarNumber FROM dbo.Cars (NOLOCK))

План:
  |--Top(ROWCOUNT est 0)
       |--Compute Scalar(DEFINE:([Expr1004]=setidentity([CarsDeleted].[ID], 453576654, 7, NULL)))
            |--Merge Join(Right Anti Semi Join, MERGE:([Cars].[CarNumber])=([CarsDeleted].[CarNumber]), RESIDUAL:([CarsDeleted].[CarNumber]=[Cars].[CarNumber]))
                 |--Sort(ORDER BY:([Cars].[CarNumber] ASC))
                 |    |--Index Scan(OBJECT:([CarData].[dbo].[Cars].[CarsFuelRpt]))
                 |--Sort(ORDER BY:([CarsDeleted].[CarNumber] ASC))
                      |--Nested Loops(Left Anti Semi Join, WHERE:([CarsDeleted].[CarNumber]=NULL))
                           |--Table Scan(OBJECT:([CarData].[dbo].[CarsDeleted]))
                           |--Row Count Spool
                                |--Top(1)
                                     |--Index Scan(OBJECT:([CarData].[dbo].[Cars].[CarsFuelRpt]))
Получаю: Violation of PRIMARY KEY constraint 'Cars_PrimaryKey'. Cannot insert duplicate key in object 'Cars'.
Не понимаю за что :)
Замена на left join ничего не дает.
Glory
Дата: 27.01.2009 10:37:23
Получаете за то, что пытаетесь добавит дубликат в PRIMARY KEY
Rivkin Dmitry
Дата: 27.01.2009 10:42:51
Glory
Получаете за то, что пытаетесь добавит дубликат в PRIMARY KEY

Я понимаю это, но не понимаю где я ошибаюсь. Я, ведь, как мне кажется, застраховался:
WHERE CarNumber NOT IN (SELECT CarNumber FROM dbo.Cars (NOLOCK))
Glory
Дата: 27.01.2009 10:43:52
Rivkin Dmitry
Glory
Получаете за то, что пытаетесь добавит дубликат в PRIMARY KEY

Я понимаю это, но не понимаю где я ошибаюсь. Я, ведь, как мне кажется, застраховался:
WHERE CarNumber NOT IN (SELECT CarNumber FROM dbo.Cars (NOLOCK))

И как вы проверили, что вам возвращает SELECT ?
alexeyvg
Дата: 27.01.2009 10:44:22
Rivkin Dmitry
Я понимаю это, но не понимаю где я ошибаюсь. Я, ведь, как мне кажется, застраховался:
WHERE CarNumber NOT IN (SELECT CarNumber FROM dbo.Cars (NOLOCK))
Вы не застраховались от дубликатов
Rivkin Dmitry
Дата: 27.01.2009 10:52:36
Glory, проверил:

SELECT ], <список полей> 		
into #t
FROM CarsDeleted (HOLDLOCK TABLOCKX)
WHERE CarNumber NOT IN (SELECT CarNumber FROM dbo.Cars (NOLOCK))

select * from Cars
inner join #t
on Cars.CarNumber = #t.CarNumber

Пусто!

alexeyvg , а как застраховаться правильно?
daw
Дата: 27.01.2009 10:55:17

у вас в CarsDeleted значения CarNumber повторяются.

Posted via ActualForum NNTP Server 1.4

Glory
Дата: 27.01.2009 10:56:26
Rivkin Dmitry
Glory, проверил:

SELECT ], <список полей> 		
into #t
FROM CarsDeleted (HOLDLOCK TABLOCKX)
WHERE CarNumber NOT IN (SELECT CarNumber FROM dbo.Cars (NOLOCK))

select * from Cars
inner join #t
on Cars.CarNumber = #t.CarNumber

Пусто!

В CarsDeleted поле CarNumber является ПК ?
iap
Дата: 27.01.2009 10:57:46
Rivkin Dmitry,

подзапрос (который Вы написали в конструкции IN) выдаёт записи.ю которые были ДО вставки.
И если Вы вставляете 100 одинаковых значений, которых в таблице до вставки не было, то это
не означает, что эти 100 дубликатов перестали быть дубликатами.
Rivkin Dmitry
Дата: 27.01.2009 11:04:45
Дошло, кажется! :(
А как сделать правильно? Открыть курсор?