как я могу разрешить повторяющиеся значения в sql? - PullRequest
2 голосов
/ 27 февраля 2020

поэтому у меня есть этот код с простыми двумя таблицами 1-GGroup 2-TimeTable

, и это код для них:

CREATE TABLE GGroup(
    ClassRoom varchar(7),
    GroupNum number(5),
    C_Code varchar(6),
    C_Name varchar(35), Field
    Teacher varchar(30),
    primary key (ClassRoom)
);

CREATE TABLE TimeTable(
    ClassRoom varchar(7),
    StudentID number(9),
    FirstName varchar(30),
    LastName varchar(30),
    primary key(ClassRoom, StudentID),
    foreign key(ClassRoom) references GGroup(ClassRoom)
);

И я уже вставил строки в таблицу GGroup с np!

Но теперь я пытаюсь вставить эту строку

insert into GGroup values (
    'A/3/54', 
    1608, 
    'ISM223', 
    'Data Warehouse & Data Mining', 
    'Dr. Yasser Al-Mshhor'
);

И я получил эту ошибку:

ORA-00001: уникальное ограничение (SQL_XAKKMDKZQBPBDDQFTDEXENGDH.SYS_C0025290829 ) нарушил ORA-06512: в "SYS.DBMS_ SQL", строка 1721

Я думаю, это потому, что эту строку я вставил раньше:

insert into GGroup values (
    'A/3/54', 
    1608, 
    'ISM223', 
    'Data Warehouse & Data Mining', 
    'Dr. Yasser Al-Mshhor'
);

Как я могу исправить это ? Я не знаю много о sql

Ответы [ 5 ]

2 голосов
/ 29 февраля 2020

Как уже указывали другие в своих ответах выше - у вас возникла эта проблема, потому что вы используете столбец ClassRoom в качестве Первичного ключа в вашей GGroup табличный скрипт т.е. primary key (ClassRoom).

Что такое PRIMARY KEY?

  • Таблица может иметь только ОДИН первичный ключ.
  • Ограничение PRIMARY KEY однозначно определяет каждая запись в таблице.
  • Первичные ключи должны содержать значения UNIQUE и не могут содержать значения NULL.

Это означает, что вы не можете вставить дублирующее значение, например A/3/54 в столбце ClassRoom . Одним из самых простых способов решения этой ошибки будет добавление еще одного столбца, например GroupId , путем изменения или удаления таблицы.

Примечание: Если в строке много строк Затем в таблице GGroup используйте оператор ALTER TABLE (уже показанный в предыдущих ответах), чем оператор DROP TABLE.

Шаг 1:

DROP TABLE GGroup;

Шаг 2:

CREATE TABLE GGroup(
    GroupId NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
    ClassRoom varchar(7),
    GroupNum number(5),
    C_Code varchar(6),
    C_Name varchar(35), Field
    Teacher varchar(30)
);

После того, как оба шага выполнены, вы можете вставить повторяющиеся значения без получения ошибки ORA-00001: unique constraint .

1 голос
/ 27 февраля 2020

Первичные ключи, должны быть уникальными, ваша классная комната установлена ​​как первичный ключ, поэтому вам не разрешено добавлять его дважды.

задайте другую переменную (например, увеличивающийся идентификатор) в качестве первичного ключа, чем вы можете добавлять комнаты чаще.

вопрос в том, почему вы добавляете одну и ту же информацию дважды?

если вы хотите заполнить комнаты в таблице расписаний, вам не нужно добавлять комнату более одного раза в группу GGroup

1 голос
/ 27 февраля 2020

В первой таблице вы объявили поле ClassRoom в качестве первичного ключа

primary key (ClassRoom)

Это означает, что поле ClassRoom является уникальным идентификатором строки, и это означает, что оно должно быть уникальным. Я не уверен, что ваши данные должны представлять там, но если вы имеете в виду, что есть группы, которые встречаются в этих классных комнатах, вы, возможно, не захотите использовать классную комнату в качестве уникального идентификатора, так как группы могут использовать то же самое класс. Как насчет создания отдельного уникального идентификатора для таблицы, как это (из вашего вопроса похоже, что вы используете Oracle, верно?)

    CREATE TABLE GGroup(
    GGGroupId NUMBER GENERATED by default on null as IDENTITY,
    ClassRoom varchar(7),
    GroupNum number(5),
    C_Code varchar(6),
    C_Name varchar(35), Field
    Teacher varchar(30)
);
1 голос
/ 27 февраля 2020

Таблица GGroup определяет столбец ClassRoom в качестве первичного ключа. Это явно запрещает дубликаты в этом столбце. Ваш код завершается ошибкой, потому что вы пытаетесь вставить запись с ClassRoom 'A/3/54', в то время как на табе уже существует другая запись с таким же значением в этом столбце.

Возможные варианты:

  • изменить первичный ключ столбца на другой, который лучше соответствует вашему варианту использования

  • изменить значение ClassRoom во вновь вставленной записи на значение который еще не существует в таблице

  • игнорировать эту ошибку: поскольку обе записи кажутся полными дубликатами, это может быть вашим лучшим выбором здесь

0 голосов
/ 27 февраля 2020

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

   CREATE TABLE GGroup(
    Id NUMBER(10)    NOT NULL,
    ClassRoom varchar(7),
    GroupNum number(5),
    C_Code varchar(6),
    C_Name varchar(35), Field
    Teacher varchar(30)
);

You need to add a PRIMARY KEY constraint:

    ALTER TABLE GGroup
  ADD (
    CONSTRAINT GGroup_pk PRIMARY KEY (Id)
  );

You need also to create a SEQUENCE that will be utilized to generate the unique, auto incremented value.

    CREATE SEQUENCE GGroup_sequence;

Finaly you need a trigger which is a stored procedure that is executed when the insert occured:

    CREATE OR REPLACE TRIGGER GGroup_on_insert
  BEFORE INSERT ON GGroup
  FOR EACH ROW
BEGIN
  SELECT GGroup_sequence.nextval
  INTO :new.Id
  FROM dual;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...