2013-11-09 4 views
0

Есть две таблицы, как это:Rename ЗНАЧЕНИЯ первичных и внешних ключей

CREATE TABLE rooms (rid CHAR PRIMARY KEY); 
CREATE TABLE users (uid INT PRIMARY KEY, rid CHAR FOREIGN KEY REFERENCES rooms(rid)) 

Цель состоит в том, чтобы переименовать ключи (значения, а не таблицы или столбца) избавиться, как это:

BEGIN TRANSACTION; 
UPDATE rooms 
SET rid = "9"||SUBSTRING(rid, 2) 
WHERE TEXT(rid) LIKE "5%"; 
UPDATE users 
SET rid = "9"||SUBSTRING(rid, 2) 
WHERE TEXT(rid) LIKE "5%"; 
END TRANSACTION; 

Конечно, это заканчивается ошибкой ограничения внешнего ключа.

В контексте переименования имени «sp_rename». Но я понял это таким образом, что он работает только с таблицами и столбцами, а не по значениям.

Как переименовать значения ограничения внешнего ключа?

.

решаемые с:

BEGIN TRANSACTION; 

ALTER TABLE users 
DROP CONSTRAINT users_rid_fkey, 
ADD FOREIGN KEY (rid) REFERENCES rooms(rid) ON UPDATE CASCADE ON DELETE RESTRICT; 

UPDATE rooms 
SET rid = '9'||SUBSTRING(rid, 2) 
WHERE rid LIKE '5%'; 

END TRANSACTION; 

ответ

2

Вы имеете несколько подходов ... А именно:

  1. уронить ограничение, обновить данные и повторно добавить ограничение.

  2. Измените ограничение, так что оно равно on update cascade.

  3. Измените ограничение, чтобы сделать его deferrable initially deferred.

  4. Добавьте правильную колонку id в комнаты и укажите, что вместо этого, чтобы избежать проблемы в целом.

+0

Я принял вариант 2. Большое спасибо! – Chickenmarkus

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