如何允许 sql 中的重复值?

how I can allow duplicate values in sql?

所以我有这个代码和简单的两个 tables 1-G群 2-时间表

这是他们的代码:

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)
);

而且我已经使用 np!

在 table GGroup 中插入了行

但现在我正在尝试插入这一行

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

我收到了这个错误:

ORA-00001: unique constraint (SQL_XAKKMDKZQBPBDDQFTDEXENGDH.SYS_C0025290829) violated ORA-06512: at "SYS.DBMS_SQL", line 1721

我认为是因为我之前插入的这一行:

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

我该如何解决这个问题?我不太了解 sql

Table GGroup 将列 ClassRoom 定义为主键。这明确禁止此列中出现重复项。您的代码失败,因为您试图插入一条带有 ClassRoom 'A/3/54' 的记录,而另一条记录已存在于该列中具有相同值的表中。

可能的选项:

  • 将列的主键更改为更能代表您的用例的其他内容

  • 将新插入记录中ClassRoom的值改为table

  • 中尚不存在的值
  • 忽略此错误:因为两条记录似乎完全重复,所以这可能是您最好的选择

Primary Keys,必须是唯一的,你的教室设置为主键,所以你不能添加两次。

设置另一个变量(如递增的 id)作为主键,这样您就可以更频繁地添加房间。

问题是为什么要添加两次相同的信息?

如果您想将房间填入您的时间table table,您不需要将房间多次添加到GGroup

在第一个 table 中,您将 ClassRoom 字段声明为主键

primary key (ClassRoom)

这意味着 ClassRoom 字段是该行的唯一标识符,这意味着它必须是唯一的。我不确定你的数据在那里应该代表什么,但如果你的意思是那些 class 房间里有团体开会,你可能不想使用 class 房间作为唯一标识符,因为团体可能会重复使用相同的 class 房间。像这样为 table 创建一个单独的唯一标识符如何(从你的问题看起来你正在使用 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)
);

您需要添加其他列主键,例如递增 ID,并创建一个序列来递增您的 ID。你可以用这样的触发器来做到这一点:

   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;

正如其他人在上面的回答中已经指出的那样 - 你遇到这个问题是因为你使用 ClassRoom 列作为 Primary Key 在您的 GGroup table 脚本中,即 primary key (ClassRoom)

什么是主键?

  • 一个table只能有一个主键。
  • PRIMARY KEY 约束唯一标识 table.
  • 中的每条记录
  • 主键必须包含唯一值,不能包含空值。

这意味着您不能在 ClassRoom 列中插入重复值,即 A/3/54。解决此错误的最简单方法之一是添加另一列,例如GroupId 通过更改或删除 table.

注意: 如果 GGroup table 中有很多行,则使用 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 错误。