Как я могу добавить все строки таблицы в другую таблицу, включая повторяющиеся строки?

#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 ни один столбец по умолчанию не равен a PRIMARY 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 , конечно, изменяет значения, но новые значения вставляются.