2012-04-20 3 views
2

Я в настоящее время имеют родительскую таблицу:родитель и дочерняя таблица внешнего ключа

CREATE TABLE members (
    member_id SERIAL NOT NULL, UNIQUE, PRIMARY KEY 
    first_name varchar(20) 
    last_name varchar(20) 
    address address (composite type) 
    contact_numbers varchar(11)[3] 
    date_joined date 
    type varchar(5) 
); 

и два связанных таблиц:

CREATE TABLE basic_member (
    activities varchar[3]) // can only have 3 max activites 
    INHERITS (members) 
); 

CREATE TABLE full_member ( 
    activities varchar[]) // can 0 to many activities 
    INHERITS (members) 
); 

У меня есть еще один стол:

CREATE TABLE planner (
     day varchar(9) FOREIGN KEY REFERENCES days(day) 
     time varchar(5) FOREIGN KEY REFERENCES times(time) 
     activity varchar(20) FOREIGN KEY REFERENCES activities(activity) 
     member bigint FOREIGN KEY REFERENCES members(member_id) 
); 
ALTER TABLE planner ADD CONSTRAINT pk_planner PRIMARKY KEY (day,time,activity,member); 

Я в настоящее время пытается добавить с помощью

INSERT INTO planner VALUES ('monday','09:00','Weights',2); 

Я добавил множество в full_members с

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', (12,'Forest Road','Mansfield','Nottinghamshire','NG219DX'),'{01623485764,07789485763,01645586754}',20120418,'Full'); 

Моих вставок в Планировщик в настоящее время не работаю — вы можете объяснить, почему?

+0

Те же комментарии, что и с другим вопросом: пожалуйста, покажите нам полную 'CREATE TABLE' и' INSERT ', которые вы пытаетесь запустить. –

+0

Добро пожаловать в StackOverflow: если вы отправляете код, XML или образцы данных, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и синтаксис выделить его! –

+1

Какая ошибка вы получаете от вставки в Планировщик? Является ли это отказом ссылки FK на дни, время или действия - или действительно номер члена? Член Hayley Sargent №2? Отдельно ли вы уверены, что день и время лучше всего представлены с помощью VARCHAR, а не с использованием правильных типов DATE и TIME? –

ответ

0

Вы пропали без вести открытую котировку до 12 по адресу:

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', (12 Forest Road', 'Mansfield', 'Nottinghamshire', 'NG219DX'), 
     '{01623485764,07789485763,01645586754}',20120418,'Full'); 

должно быть:

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', ('12 Forest Road', 'Mansfield', 'Nottinghamshire', 'NG219DX'), 
     '{01623485764,07789485763,01645586754}',20120418,'Full'); 
+0

Вставка в full_members работает отлично, я могу выбрать запись, и все идеально, это вставка в планировщик, у меня возникают проблемы с –

+0

А, ну, если вы поменяете INSERT, как и вы, то да, это будет Работа. –

2

мне удалось ВЗ ответить на мой собственный вопрос был becuase на данный момент PosgreSQL Безразлично» t работают очень хорошо с наследованием и внешними ключами, поэтому я не создаю правило

CREATE RULE member_ref 
AS ON INSERT TO planner 
WHERE new.member NOT IN (SELECT member_id FROM members) 
DO INSTEAD NOTHING; 

t его в основном так же, как внешний ключ

1

Не уверен, что если это будет лучшее решение, но здесь идет ...

Принцип довольно прост:

  • создать новую таблицу позволяет называть его table_with_pkeys, который будет копировать столбец первичного ключа (ов), унаследованных таблиц child1, child2, child3 ...
  • создавать триггеры унаследованных таблиц, после вставки, вставьте новый ПК в table_with_pkeys вновь созданного ПК, после обновления, если Ch anges обновить его и после удаления удалить тот же PK из table_with_pkeys.
  • Затем в каждой таблице, которая должна ссылаться на child1, child2 или какой-либо из PK родительской таблицы с использованием FK, укажите FK не на родительский ПК, а на table_with_pkeys, который имеет копии всех дочерних PK, и поэтому у вас будет простой способ управления имеют внешние ключи, которые могут каскадировать обновления, ограничивать обновления и так далее.

Надеюсь, что это поможет.

+0

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

+0

почему бы это, больше, чем оригинал? Все, что вы делаете, - это материализация представления первичных ключей. –

0

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

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