#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть 2 таблицы, append_table и source_table. Я хочу добавить все строки из source_table в append_table. Это то, что у меня есть:
CREATE TABLE source_table (
id INTEGER PRIMARY KEY,
val CHARACTER);
INSERT INTO source_table (id, val)
VALUES
(1, NULL),
(2, 'B'),
(4, 'B'),
(8, 'B'),
(9, 'B'),
(10, NULL),
(11, NULL);
CREATE TABLE append_table (
id INTEGER PRIMARY KEY,
val CHARACTER);
INSERT INTO append_table(id, val)
VALUES
(1, 'A'),
(2, 'A'),
(3, NULL),
(5, 'A'),
(8, 'A'),
(9, NULL),
(10, NULL);
INSERT INTO append_table SELECT * FROM source_table
Это выдает ошибку, которая
Не удается вставить дубликат ключа в объект ‘dbo.append_table’.
Тем не менее, я хочу включить повторяющиеся значения. Как я могу это сделать?
Комментарии:
1. «Тем не менее, я хочу включить повторяющиеся значения». Тогда зачем устанавливать его как
PRIMARY KEY
?2. @Larnu Я этого не сделал. Я предполагаю, что по умолчанию это так? Я новичок в SQL, поэтому я не совсем понимаю, как бы я это изменил.
3. «Я этого не делал». Да, вы сделали:
id INTEGER PRIMARY KEY
ни один столбец по умолчанию не равен aPRIMARY KEY
, вы должны указать, чтобы он был.4. @Larnu Мои извинения, теперь я понимаю. Большое вам спасибо!
Ответ №1:
Самым простым способом было бы объявить столбец как identity
столбец в append_table
. Это позволяет базе данных выбирать первичный ключ.
Например, вы можете вычислить максимальный идентификатор в append_table
, а затем добавить его к идентификаторам в исходной таблице:
INSERT INTO append_table (id, val)
SELECT a.max_id s.id, s.val
FROM source_table s CROSS JOIN
(SELECT MAX(id) as max_idf FROM append_table) a;
Это id
, конечно, изменяет значения, но новые значения вставляются.