Изменить внешний ключ с помощью SQL - PullRequest
0 голосов
/ 17 мая 2011

У меня есть такая таблица:

ID    Name      Email           Referred_by
-------------------------------------------
1     John      john@foo.com    NULL
2     Sam       sam@foo.com     john@foo.com
3     Sally     sally@foo.com   sam@foo.com
..... more rows .....

И я хотел бы изменить ее на:

ID    Name      Email           Referred_by
-------------------------------------------
1     John      john@foo.com    NULL
2     Sam       sam@foo.com     1
3     Sally     sally@foo.com   2
..... more rows .....

Могу ли я сделать это изменение с помощью SQL?

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Многие СУБД позволят это с помощью операторов DDL (определение), а не DML (манипулирование). Предполагая, что id является целочисленным типом, а referred_by является (в настоящее время) текстовым столбцом, вы можете сделать что-то вроде:

  • измените таблицу, добавив новый столбец ref2 (обнуляемый) того же типа, что и id.
  • установить ограничение внешнего ключа между ref2 и id.
  • заполнить столбец ref2 для всех строк.
  • отбросить исходное ограничение.
  • изменить таблицу для удаления столбца referred_by.
  • изменить таблицу для переименования столбца ref2 в referred_by.
1 голос
/ 17 мая 2011

Это должно сработать:

UPDATE my_table a
set    a.referred_by = (
       SELECT b.id
       FROM   my_table b
       WHERE  b.email = a.referred_by
);
...