Sql (Oracle): вставить повторяющийся ключ

Гарри - волшебник, и он создает группу под названием «Братство кольца». Номер волшебника Гарри - 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 );

Подсказка: вы знаете, что означает «первичный ключ»?

Gordon Linoff 16.05.2018 12:38

ограничение однозначно идентифицирует каждую запись

AAlex 16.05.2018 12:41

@AAlex Кстати, Why the fellowship of the ring определяется как в таблице групп, так и в таблице активности?

Jacob 16.05.2018 12:45

Есть много занятий, и группа присоединяется к одному из них.

AAlex 16.05.2018 12:48

@AAlex Рекомендуется воздерживаться от использования длинных описаний в качестве ключа для объединения таблиц.

Jacob 16.05.2018 12:54
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
479
2

Ответы 2

  • Не используйте зарезервированное слово 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 в таблице действий.
  • Если вы не хотите разрешать дублирование мастеров в каждой группе, тогда первичный ключ в таблице действий должен быть составным ключом как для первичных ключей мастеров, так и для таблиц групп.
  • Вы можете использовать последовательности для создания уникальных значений первичного ключа.

Как это:

SQL Fiddle

Настройка схемы 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 |

Другие вопросы по теме