странный вопрос. я вставляю 10 000 записей или около того в таблицу, а первичный ключ не является полем «Идентификация». поэтому при вставке всех 10 000, если некоторые дубликаты, есть ли способ перейти к следующей записи в sql server insert и убедиться, что не дубликаты идут? я действительно не забочусь о том, чтобы дубликаты не вставали.первичный ключ дубликат записи обход следующей вставки
ответ
Используйте опцию «Игнорировать дублирующийся ключ».
Простейший способ сделать это - удалить основной ключ в SQL Server Management Studio.
Затем создайте новый указатель типа «Index», установите Is Unique на «Yes» и установите «Ignore Duplicate Keys» на «Yes». Затем вставьте свои записи. Он будет вставлять их все, кроме дубликатов. Когда вы закончите, вы можете удалить этот индекс и воссоздать свой основной ключ.
Если вы хотите метод TSQL, смотрите опцию IGNORE_DUP_KEY в вызове CREATE INDEX:
EDIT:
Другим способом было бы использовать LEFT JOIN между источником таблицу и записи, которые вы собираетесь вставить, и предложение GROUP BY, только вставляя записи, которые не существуют в вашем источнике. GROUP BY уничтожит ваши дубликаты в новых записях.
Несколько способов приходят в голову, поскольку я не знаю, какой механизм вы используете для вставки.
1) Массовая загрузка всех записей в новую пустую таблицу, а затем запуск INSERT в реальную таблицу из этой промежуточной таблицы, где запись еще не существует в основной таблице. , например.
INSERT MyRealTable (PKField, Field1)
SELECT x.PKField, x.Field1
FROM MyStagingTable x
LEFT JOIN MyRealTable r ON x.PKField = r.PKField
WHERE r.PKField IS NULL
2) оберните каждую вставку в TRY...CATCH блоке проглотить ошибку PK ограничение должно произойти один (если вы используете SQL 2005 или более поздней версии).
no новые записи не отмечены для дубликатов, а не только для нового существующего – uirn
Используя параметр 1, вы должны просто вытащить одну запись за значение PKField из промежуточной таблицы в реальную таблицу. например вы можете иметь столбец IDENTITY в промежуточной таблице и просто получить первый экземпляр каждого значения PKField. – AdaTheDev
Этот пример запроса пропустить повторяющиеся строки по ПК1:
INSERT INTO Dest (PK1, Field2)
SELECT s.PK1, s.F2
FROM Source s
WHERE
(
SELECT TOP 1 d.PK1
FROM Dest d
WHERE d.PK1 = s.PK1
) IS NULL
вам необходимо определить свой первичный ключ игнорировать дубликаты:
CREATE TABLE [dbo].[t2](
[n] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[n] ASC
)WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Использование этой опции может повредить производительности:
Если ваши данные имеют небольшой процент дубликатов, тогда IGNORE_DUP_KEY может ускорить ваши вставки. Для большего количества дубликатов IGNORE_DUP_KEY может значительно замедлить их. Я создал две таблицы, раздевая вниз все ненужные детали, а именно:
CREATE TABLE t1(n INT NOT NULL PRIMARY KEY)
GO
CREATE TABLE [dbo].[t2](
[n] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[n] ASC
)WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Если входные данные не имели никаких дубликатов, производительность обеих вставок была последовательно то же самое:
INSERT t1(n)
SELECT n FROM dbo.Numbers
INSERT t2(n)
SELECT n FROM dbo.Numbers
(Примечание что dbo. Числа имеют 1 миллион строк.) Конечно, я всегда урезал обе таблицы между моими тестами.
Если входные данные имели 1% от дубликатов, вставка с IGNORE_DUP_KEY последовательно выполняется примерно на 5% быстрее:
INSERT t1(n)
SELECT DISTINCT n FROM(
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers WHERE n <10000
) AS t
INSERT t2(n)
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers WHERE n <10000
С другой стороны, если входные данные были 100% дубликаты, вставки с IGNORE_DUP_KEY последовательно выполняется по меньшей мере, 300% медленнее, как для большого набора 2 миллиона строк:
INSERT t1(n)
SELECT DISTINCT n FROM(
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers
) AS t
INSERT t2(n)
SELECT n FROM dbo.Numbers
UNION ALL
SELECT n FROM dbo.Numbers
Как и для меньшего набора строк 200K:
INSERT t1(n)
SELECT DISTINCT n FROM(
SELECT n FROM dbo.Numbers WHERE n<100000
UNION ALL
SELECT n FROM dbo.Numbers WHERE n<100000
) AS t
INSERT t2(n)
SELECT n FROM dbo.Numbers WHERE n<100000
UNION ALL
SELECT n FROM dbo.Numbers WHERE n<100000
В целом, я решил не использовать IGNORE_DUP_KEY в моем конкретном случае. Я решил, что небольшие сбережения для небольшого количества дубликатов не оправдывают риск огромного падения производительности для большего количества дублированных данных.
- 1. Почему первичный ключ дубликат
- 2. Получить первичный ключ из вставки
- 3. JDBC сгенерированный ключ из вставки в дубликат
- 4. Только первичный ключ вставки SQLite
- 5. Первичный ключ нарушение ограничения
- 6. Как я могу запросить первичный ключ сразу после вставки записи?
- 7. Получить первичный ключ новой записи
- 8. Entity Framework внешний ключ вставки дубликат ключа
- 9. дубликат записи для ключа первичного в тузд вставки
- 10. Знать первичный ключ строки после вставки
- 11. Получить первичный ключ вставки MySQL, используя PHP
- 12. иностранных первичный ключ вставки (прирост выпуска)
- 13. MySQL получить первичный ключ после установки вставки
- 14. Получить первичный ключ записи отношений с ObjectContext
- 15. Как изменить первичный ключ записи в sqlite?
- 16. varchar() первичный ключ или int первичный ключ?
- 17. Составной первичный ключ против автоинкрементируемого Первичный ключ
- 18. смущены вставки на дубликат ключа обновления
- 19. Передача Первичный ключ к следующей странице с Django
- 20. Как обновить первичный ключ?
- 21. DataGridView вставляет первичный ключ
- 22. вставки на дубликат обновления, всегда вставить
- 23. Первичный/внешний ключ
- 24. Необязательный первичный ключ mySQL
- 25. Композитный первичный ключ MySql
- 26. Первичный ключ на колонке
- 27. Зачем нужен первичный ключ?
- 28. Прерывание вставки, если дубликат
- 29. JPA - Invalid дубликат вставки
- 30. руководство как первичный ключ?
для первичного ключа? – uirn
Первичный ключ не будет нарушен, оскорбительная запись создает предупреждение, не откатывая всю объемную вставку. – JeffO