2016-10-24 5 views
0

У меня возникла проблема при создании/разработке таблиц в DB2.дизайн таблицы с проверочным столбцом или столбцом со ссылкой на первичный ключ, который обновляется

У меня есть две таблицы, таблицы users и таблицы countries созданы, как показано ниже

create table users 
    (
    firstname   varchar(20)  not null, 
    lastname   varchar(20)  not null, 
    gender   char(1)   not null check (gender in ('M','F')), 
    birthdate   date    not null, 
    country   char(3)   not null, 
) 

create table testing.countries 
    (
    name  varchar(60)  not null, 
    code2  char(2)   not null, 
    code3  char(3)   not null 
) 

Я хочу, чтобы в колонке country в таблице users с 3-обугленного код страны происхождения и во время введения данные, которые необходимо проверить, если они действительны (или, лучше сказать, если они существуют) из списка стран, которые хранятся в таблице countries.

Поскольку DB2 не поддерживает подзапросы/подвыбор в опции проверки (что было бы лучше для меня), то это выглядит как кандидат на внешний ключ на колонке country в users ссылающегося на первичный ключ на колонке code3 в countries. Но в случае обновления 3-символьного кода любой страны, это будет невозможно обновить его простым способом. Я знаю, что обновление этого будет не так часто и может быть сделано вручную, сначала вставив новые данные в countries, а затем обновив значения в users, а затем удалив старые значения в countries, но, к сожалению, будет больше похожих таблиц, где будут должны быть проверены при вставке в другую таблицу, а данные в таблице ссылок будут обновляться довольно часто, а затем обновление вручную неудобно. И, конечно же, я хочу, чтобы данные в users были обновлены, если будет выполнено обновление в countries.

Что я хочу спросить, как это решить. Я думал о некоторых before или instead of триггера, но до этого не может быть использована для изменения данных в других таблицах и ВМЕСТО ожидает Нетипизированные VIEW не СТОЛ

SQL0159N The statement references an object that identifies an unexpected 
object type. Object: "COUNTRIES". Object type: "TABLE". Expected object type: 
"UNTYPED VIEW". LINE NUMBER=2. SQLSTATE=42809` 

Можете ли вы мне посоветуете?

Заранее спасибо

+1

Это * звучит *, как вы хотите ограничение внешнего ключа, а не триггер. –

+0

Да, внешний ключ является одним из вариантов, но как сделать столбец 'code3' в таблице' countries' обновляемым, когда он будет ссылаться? – srbik

+0

У вас есть контроль над процессом, который обновляет данные? Обеспечивает ли целостность там, а не ограничениями базы данных, возможность? –

ответ

0

попробовать что-то вроде этого:

 create table testing.users 
     (
     firstname   varchar(20)  not null, 
     lastname   varchar(20)  not null, 
     gender   char(1)   not null check (gender in ('M','F')), 
     birthdate   date    not null, 
     country   char(3)   not null 
     ) 

     create table testing.countries 
     (
     name  varchar(60)  not null, 
     code2  char(2)   not null, 
     code3  char(3)   not null 
     ) 

     ALTER TABLE testing.users ADD CONSTRAINT testing.PK_Users PRIMARY KEY 
     (firstname, lastname); 

     ALTER TABLE testing.countries ADD CONSTRAINT testing.PK_Countries PRIMARY KEY 
     (code3); 

     ALTER TABLE testing.users ADD CONSTRAINT testing.FK_Users_Countries FOREIGN KEY 
     (country) 
     REFERENCES testing.users 
     (code3) 
     ON DELETE CASCADE; 
+0

два вопроса: 1) зачем создавать PK в таблице 'users'? не нужен для решения этой проблемы, или нет? 2) в таблице 'countries', действительно создать PK в столбце' name'? Столбец 'users' разработан как char (3), чтобы соответствовать столбцу' code3' в 'countries', а не столбцу' name', то же самое для ссылки на FK – srbik

+0

1) не требуется, но таблица должна иметь первичный ключ, его лучше 2) да, если вы хотите сделать внешний ключ 3) я изменяю свой код для pk, это код3 в таблице contries – Esperento57

+0

PK на таблице «пользователи» действительно не нужны, по крайней мере в этом случае ... после обновление ПК в «странах» для меня начинает иметь смысл ... но все же это не то, что я хочу, и то, о чем я просил, - вы упомянули «УДАЛИТЬ КАСКАД», но этого я не хочу, когда буду (попробуйте) удалить запись из «стран», на которую будет ссылаться, поэтому я также не хочу, чтобы запись удалялась из пользователей - на самом деле я хочу остановиться, чтобы «ON DELETE RESTRICT» или «ON DELETE NO ACTION» для использования вместо этого. Но я до сих пор не знаю, как сделать таблицы 'countries' обновляемыми, когда ссылаются на« code3 » – srbik