2013-08-08 9 views
0

можно ли обновить primary key, имеющее более одной таблицы картирование? Как я могу обновить ID в Мастер стол?Обновление первичного ключа спящего режима

CREATE TABLE Master (id INT, name VARCHAR(20),address VARCHAR(20),Primary key(id)); 

CREATE TABLE Slave_1 (id INT,s1_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s1_id),Foreign Key (id) references Master(id)); 

CREATE TABLE Slave_2 (id INT,s2_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s2_id),Foreign Key (id) references Master(id)); 
+1

Первичный ключ считается постоянным для времени жизни Вселенной или, по крайней мере, для срока службы приложения. Никогда не должно быть оснований обновлять первичный ключ какого-либо объекта! –

ответ

0

Вы можете сделать следующее:

  1. Отключение внешних ключей.

  2. Update ID/ссылки

  3. Включение внешнего ключа.

+0

Это означает, что вы потеряете ссылочную целостность на время изменения идентификаторов. Все другие транзакции, происходящие одновременно, могут затем оставить вас в противоречивом состоянии и, возможно, вы не сможете повторно активировать ограничения после изменения идентификаторов. –

+0

Я согласен с тем, что вы сказали, но это обходное решение. –

+0

@UwePlonus такое изменение в БД настолько серьезное, что оно должно быть сделано во время обслуживания-выключения в любом случае, поэтому не должно быть других транзакций одновременно –

0

Вы не можете без изменения ограничений.

Это ограничение базы данных, а не спящего режима.

Когда вы меняете id таблицы Master, колонкистолбцов не имеют ссылки.

То же самое было бы, если вы попытаетесь изменить таблицы подчиненных id.

Также почему вы пытаетесь изменить первичный ключ? Это очень необычно.

+0

У меня есть идентификатор, который может использоваться разными таблицами в качестве внешнего ключа ... Мне нужно обновить идентификатор другим ...Есть ли какое-либо решение –

0

Это очень плохая практика для изменения первичного ключа.

Не можете ли вы создать новую главную запись, пусть подчиненные указывают на новую запись, а затем удалите старую запись. Это будет работать в Hibernate без необходимости использования чистого SQL-кода или отключений.

+0

, если есть альтернативное решение. –

+0

Единственное альтернативное решение - использовать собственный SQL, возможно, используя внешние ключи @ AdamDyga 'on update cascade'. Но если вы сделаете какое-либо обновление через собственные SQL-запросы, hibernate не узнает об этом, поэтому вам нужно убедиться, что вы выбрали все связанные кешированные объекты в кеше 1-го или 2-го уровня. Если вы создаете новую запись, как я предлагаю, все кеши будут обновляться автоматически. – greyfairer

+0

Как уже упоминалось в другом комментарии, такое изменение настолько серьезное, что я бы не рискнул сделать это в живой базе данных. –

0

Прежде всего, изменение идентификатора - это то, что обычно никто не должен делать. Но если есть какая-то причина для этого, то это невозможно сделать с помощью Hibernate (т.е. и отображаемых классов). Hibernate не будет терпеть этого и повысить ошибку, если вы попытаетесь изменить идентификатор объекта.

Чтобы внести изменения, вы должны использовать собственные запросы. И, вероятно, самый безопасный и простой способ сделать это - позволить БД выполнить эту работу за вас. Вам нужно только определить «on update cascade» действие для столбцов внешнего ключа.

CREATE TABLE Master (id INT, name VARCHAR(20),address VARCHAR(20),Primary key(id)); 

CREATE TABLE Slave_1 (id INT,s1_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s1_id),Foreign Key (id) references Master(id) **on update cascade**); 

CREATE TABLE Slave_2 (id INT,s2_id INT,area VARCHAR(20),project VARCHAR(20),primary key(s2_id),Foreign Key (id) references Master(id) **on update cascade**); 

Таким образом, всякий раз, когда вы изменить столбец ID в мастер-таблицы, то он будет автоматически каскадно всех ссылающихся столбцов.

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