2015-05-01 3 views
0

У меня есть две таблицы:Получить Дубликаты и обновление столбца в другой таблице SQL

Стихи:

--------------------------------------------------- 
| id |  poem  |  author  | 
--------------------------------------------------- 
| 1 | Blah blah Hey |  Jane Doe  | 
--------------------------------------------------- 
| 1 | Yo yo Hey Bla |  Jane Doe  | 
--------------------------------------------------- 

Авторы:

----------------------------- 
| id |  name  | 
----------------------------- 
| 0 |     | 
----------------------------- 

Я хочу, чтобы удалить дубликаты из таблицы стихов и заполнить таблицу вновь созданных авторов. В идеале я хотел бы, чтобы затем обновить автор (или создать новый authors_id) столбец в таблице стихов с author.id

Я знаю, что следующий код показывает мне дубликаты,

SELECT author, COUNT(*) 
FROM poem 
GROUP BY author 
HAVING 
    COUNT(*) > 1 

Но как добавить их в столбец author.names?

Также будет ли этот код помогать мне со следующей частью?

ALTER TABLE poem 
    ADD COLUMN author_id serial, 
    ADD CONSTRAINT author_id FOREIGN KEY (id) REFERENCES author (id) MATCH FULL; 

Любые идеи?

ответ

0

Чтобы получить уникальный идентификатор, вы можете использовать Postgres' distinct on оператора:

insert into Authors (id, author) 
select distinct on (id) id, author 
from Poems 
order by id 

Это подберет первый идентификатор из poems таблицы для каждого автора. Другой альтернативой является установка таблицы стихи с порядковым колонки:

Если вы настроили id столбец в качестве последовательного столбца вы не должны поставить значение в первую очередь, просто использовать:

insert into Authors (author) 
select distinct author 
from Poems; 

Но, не указав id столбец, он будет заполняться автоматически (если оно определяется как serial)

Но это:

ALTER TABLE Стихотворение
        ADD COLUMN AUTHOR_ID серийный,
        ADD CONSTRAINT AUTHOR_ID FOREIGN KEY (ID) ЛИТЕРАТУРЫ автор (идентификатор) МАТЧ ПОЛНЫЙ;

не имеет смысла. Если вы определяете столбец как serial, он будет автоматически увеличиваться каждый раз, когда вы вставляете строку, которая не указывает значение для столбца. Как это будет ссылаться на столбец id таблицы authors?Я не могу изображения любой ситуации, когда это имеет смысл, чтобы определить столбец внешнего ключа как serial

После того, как вы заселили authors таблицу вам нужно добавить author_id столбец в таблице poem, но она должна не быть последовательным колонка:

ALTER TABLE poem 
    ADD COLUMN author_id integer, 
    ADD FOREIGN KEY (author_id) REFERENCES author (id); 

После того, как вы есть, что вы можете запустить обновление:

update poem 
    set author_id = author.id 
from author 
where author.name = poem.author; 

После этого вы можете отказаться от стола poem.author.

SQLFiddle пример: http://sqlfiddle.com/#!15/79b13/1

+0

Определяется как серийный номер! Я должен был, наверное, упомянуть об этом. Любая идея, как определить авторов в столбце poem.author как внешний ключ, а затем повторно заполнить его с помощью poem.id? Либо это, либо создайте новый столбец poem.author_id и заполните его таким образом ... – joshuar500

+0

Ах, да, я вижу эту ошибку. Что бы это было нужно тогда как внешний ключ. Int? – joshuar500

+0

Я добавил пример SQLFiddle. Обратите внимание, что ваш 'add foreign key' был неправильным. –

0

Попробуйте вставить из оператора select. Например, как это:

insert into Authors (id, author) 
    select distinct id, author 
    from Poems 
+0

Закрыть! Если вы удалите столбцы «id», я удалю дубликаты. Если я сохраню 'id', тогда я получаю отличные значения id, помещенные в автора, что я не хочу, потому что у некоторых авторов есть разные идентификаторы в стихах. – joshuar500

Смежные вопросы