Гарри - волшебник, и он создает группу под названием «Братство кольца». Номер волшебника Гарри - 77.
INSERT INTO group VALUES ('the fellowship of the ring','01');
INSERT INTO activity VALUES ('01','77','the fellowship of the ring’);
Гондор также хочет присоединиться к группе и activity01.
Из таблицы мы знаем, что «wizardno» - это первичный ключ таблицы мастера.
«Groupname» - это первичный ключ групповой таблицы. «Acitvityno» - UF-ключ групповой таблицы.
Acitvityno - это первичный ключ таблицы действий.
«Groupname» - это внешний ключ таблицы действий. «Wizardno» - это ключ УФ таблицы активности.
добавить Гондора в группу Гарри. Номер волшебника Гондора - 99.
я использую
insert into activity values (’01’,’99’,’the fellowship of the ring’);
Получил ошибку: Причина: оператор UPDATE или INSERT попытался вставить повторяющийся ключ. Для Trusted Oracle, настроенного в режиме MAC СУБД, вы можете увидеть это сообщение, если на другом уровне существует повторяющаяся запись. * Действие: либо удалите уникальное ограничение, либо не вставляйте ключ.
Но это должно оставаться единственным ограничением.
drop table wizard;
drop table activity;
drop table group;
CREATE TABLE wizard (
wizardno NUMBER(2) NOT NULL,
wizardname VARCHAR2(30) NOT NULL,
);
ALTER TABLE wizard ADD CONSTRAINT wizard_pk PRIMARY KEY ( wizardno );
CREATE TABLE group (
groupname VARCHAR2(30) NOT NULL,
activityno NUMBER(2) NOT NULL
);
ALTER TABLE group ADD CONSTRAINT group_pk PRIMARY KEY ( groupname );
CREATE TABLE activity (
activityno NUMBER(2) NOT NULL,
wizardno CHAR(2) NOT NULL,
groupname VARCHAR2(30)
);
ALTER TABLE activity
ADD CONSTRAINT activity_pk PRIMARY KEY ( activityno );
ALTER TABLE activity
ADD CONSTRAINT activity_wizard_fk FOREIGN KEY ( wizardno )
REFERENCES wizard ( wizardno );
ALTER TABLE activity
ADD CONSTRAINT activity_group_fk FOREIGN KEY ( groupname )
REFERENCES group ( groupname );
ограничение однозначно идентифицирует каждую запись
@AAlex Кстати, Why the fellowship of the ring определяется как в таблице групп, так и в таблице активности?
Есть много занятий, и группа присоединяется к одному из них.
@AAlex Рекомендуется воздерживаться от использования длинных описаний в качестве ключа для объединения таблиц.


group в качестве имени таблицы.'' для переменных строкового типаВам необходимо вставить соответствующие значения для справочных таблиц (
в данном случае wizard), на который вы ссылались для приличной целостности
столы.
Для отношения внешнего ключа и первичного ключа оба ссылочных столбца в
обе таблицы должны быть одного типа (вы можете преобразовать тип столбца wizardno из CHAR (2) в число (2) в таблице activity).
Значение столбца первичного ключа не должно дублироваться (здесь
имя ограничения - activity_pk)
Таким образом, можно использовать следующий набор команд:
drop table wizard;
drop table activity;
drop table group_;
CREATE TABLE wizard (
wizardno NUMBER(2) NOT NULL,
wizardname VARCHAR2(30) NOT NULL
);
ALTER TABLE wizard ADD CONSTRAINT wizard_pk PRIMARY KEY ( wizardno );
CREATE TABLE group_ (
groupname VARCHAR2(30) NOT NULL,
activityno NUMBER(2) NOT NULL
);
ALTER TABLE group_ ADD CONSTRAINT group_pk PRIMARY KEY ( groupname );
CREATE TABLE activity (
activityno NUMBER(2) NOT NULL,
wizardno NUMBER(2) NOT NULL,
groupname VARCHAR2(30)
);
ALTER TABLE activity
ADD CONSTRAINT activity_pk PRIMARY KEY ( activityno );
ALTER TABLE activity
ADD CONSTRAINT activity_wizard_fk FOREIGN KEY ( wizardno )
REFERENCES wizard ( wizardno );
ALTER TABLE activity
ADD CONSTRAINT activity_group_fk FOREIGN KEY ( groupname )
REFERENCES group_ ( groupname );
INSERT INTO wizard VALUES ( 77, 'Abc');
INSERT INTO wizard VALUES ( 99, 'Def');
INSERT INTO group_ VALUES ('the fellowship of the ring','01');
INSERT INTO activity VALUES ('01',77,'the fellowship of the ring');
INSERT INTO activity VALUES ('02',99,'the fellowship of the ring');
GROUP в качестве имени таблицы. Вместо этого вы можете использовать имена таблиц во множественном числе (wizards, groups, activities).wizardno - это тип NUMBER(2) в таблице мастеров и CHAR(2) в таблице действий, если между ними есть ссылка на внешний ключ. Они должны быть одного типа.groupname в таблице действий.Как это:
Настройка схемы Oracle 11g R2:
CREATE TABLE wizards (
wizardno NUMBER(2)
CONSTRAINT wizards_wizardno_pk PRIMARY KEY,
wizardname VARCHAR2(30)
CONSTRAINT wizards_wizardname_nn NOT NULL
);
CREATE SEQUENCE wizards_wizardno_seq;
CREATE TABLE groups (
groupname VARCHAR2(30)
CONSTRAINT groups_groupname_u UNIQUE
CONSTRAINT groups_groupname_nn NOT NULL,
groupno NUMBER(2)
CONSTRAINT groups_groupno_pk PRIMARY KEY
);
CREATE SEQUENCE groups_groupno_seq;
CREATE TABLE activities (
activityno NUMBER(2)
CONSTRAINT activities_activityno_pk PRIMARY KEY,
groupno NUMBER(2)
CONSTRAINT activities_groupno_nn NOT NULL
CONSTRAINT activities_groupno_fk REFERENCES groups ( groupno ),
wizardno NUMBER(2)
CONSTRAINT activities_wizardno_nn NOT NULL
CONSTRAINT activities_wizardno_fk REFERENCES wizards ( wizardno ),
CONSTRAINT activities_group_wizard_u UNIQUE ( groupno, wizardno )
);
CREATE SEQUENCE activities_activityno_seq;
INSERT INTO wizards ( wizardno, wizardname )
VALUES ( wizards_wizardno_seq.NEXTVAL, 'Harry' );
INSERT INTO wizards ( wizardno, wizardname )
VALUES ( wizards_wizardno_seq.NEXTVAL, 'Gondor' );
INSERT INTO groups ( groupname, groupno )
VALUES ( 'the fellowship of the ring', groups_groupno_seq.NEXTVAL );
INSERT INTO activities ( activityno, groupno, wizardno )
VALUES ( activities_activityno_seq.NEXTVAL, 1, 1 );
INSERT INTO activities ( activityno, groupno, wizardno )
VALUES ( activities_activityno_seq.NEXTVAL, 1, 2 );
Запрос 1:
SELECT wizardname,
groupname
FROM wizards w
INNER JOIN activities a
ON ( w.wizardno = a.wizardno )
INNER JOIN groups g
ON ( a.groupno = g.groupno )
| WIZARDNAME | GROUPNAME |
|------------|----------------------------|
| Harry | the fellowship of the ring |
| Gondor | the fellowship of the ring |
Подсказка: вы знаете, что означает «первичный ключ»?