SQL: как обновить составной ключ? - PullRequest
0 голосов
/ 17 ноября 2011

В пользовательском интерфейсе я показываю account_id и account_name.
Пользователь может обновить account_id, а также account_name, и account_id является уникальным для пользователя.Поскольку я разрешаю пользователю обновлять account_id (составной ключ), как я могу создать предложение where при выполнении обновления?

Ниже приведен дизайн моей таблицы.

CREATE TABLE accounts (
  user_id      VARCHAR2(20)  NOT NULL,
  account_id   VARCHAR2(20)  NOT NULL, 
  account_name VARCHAR2(20)  NOT NULL
)

ALTER TABLE accounts ADD CONSTRAINT
uk_myTable_1 UNIQUE (User_id, account_id)

Ответы [ 4 ]

3 голосов
/ 17 ноября 2011

Значения account_id и user_id сохраняются до тех пор, пока вы их не измените.

Таким образом.если он начинается как user_id 10 с account_id 20 и вы меняете account_id на 30, например

 UPDATE accounts 
    SET account_id = '30' 
  WHERE account_id = '20'
        AND user_id = '10';

Хотя вышеприведенное работает для ситуаций, когда вы сохраняете все значения вашего составного ключа, я 'все за неизменный ключ за кулисами, который никогда не передается и не отображается.Это устраняет проблемы со связями внешних ключей и обновлениями частей составных ключей.Чтобы реализовать это, добавьте поле (AccountID), которое является PK и используется в связях FK.

В качестве альтернативы, Oracle может сделать что-то похожее, используя ROWSCN и в средах без состояний зависимости строк во всех таблицах.Проблема, с которой вы можете столкнуться при использовании, если просто AccountID, состоит в том, что в многопользовательской среде можно сделать так, чтобы человек сделал обновление для записи 1, а пользователь 2 - для редактирования записи 1, а затем сохранить;переписывает обновления пользователя 1.По этой причине я упомянул ROWSCN и ROWDEPENDENCIES.Однако, если вы находитесь в среде, осведомленной о состоянии, это будет излишним.

Наконец, вы можете изменить порядок операций, чтобы выполнить обновление базы данных ДО того, как вы обновите свой класс.Таким образом, у вас есть оба значения.

0 голосов
/ 17 ноября 2011

Единицей работы в SQL является строка, а не столбец.

Теперь на самом деле не запускайте это, но считайте, что :

UPDATE accounts 
   SET user_id = account_id, 
       account_id = user_id ;

успешно поменяет местами user_id и account_id для всех пользователей. Это связано с тем, что все строки, затронутые обновлением (согласно определению WHERE), обновляются одновременно.

0 голосов
/ 17 ноября 2011

Попробуйте это:

UPDATE accounts SET account_id = New_account,account_name = new_name
WHERE user_id = Old_id and account_id = old_account_id
0 голосов
/ 17 ноября 2011
UPDATE accounts
SET whatevercolumnsyouwantasnormal
WHERE USER_ID = 'whatever' and ACCOUNT_ID = 'whatever2'

Очевидно, что для этого потребуется отслеживать исходные USER_ID и ACCOUNT_ID (отдельно от новых) до тех пор, пока вы не введете ОБНОВЛЕНИЕ.

Если это веб-приложение (в частности), убедитесь, чтоРассмотрим случай, когда пользователь запускает этот процесс дважды в быстрой последовательности.

В качестве альтернативы посмотрите в Oracle RowID .Вы можете использовать его в предложении WHERE вместо столбцов PK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...