如何允许 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
错误。
所以我有这个代码和简单的两个 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
错误。