这个 SQL CREATE + INSERT 批处理有什么问题?
What's wrong with this SQL CREATE + INSERT batch?
这个SQL声明有什么问题?
Create table JaretsSchedule
(
ScheduleID Int Primary Key NOT NULL,
FieldID Int NOT NULL,
HomeTeamID Int NOT NULL,
AwayTeamID Int NOT NULL,
GameTime DateTime NOT NULL
);
Insert into JaretsSchedule
Values
(1, 1, 1, 2, '2012-10-02 12:00:00'),
(1, 1, 1, 3, '2012-10-17 12:00:00'),
(1, 1, 1, 4, '2012-09-23 12:00:00'),
(1, 2, 2, 1, '2012-09-12 12:00:00'),
(1, 3, 3, 1, '2012-08-19 12:00:00'),
(1, 4, 4, 1, '2012-07-25 12:00:00'),
(2, 2, 2, 1, '2012-09-15 12:00:00'),
(2, 2, 2, 3, '2012-09-06 12:00:00'),
(2, 2, 2, 4, '2012-08-28 12:00:00'),
(2, 1, 1, 2, '2012-10-02 12:00:00'),
(2, 3, 3, 2, '2012-08-11 12:00:00'),
(2, 4, 4, 2, '2012-07-17 12:00:00'),
(3, 3, 3, 1, '2012-08-19 12:00:00'),
(3, 3, 3, 2, '2012-08-11 12:00:00'),
(3, 3, 3, 4, '2012-08-03 12:00:00'),
(3, 1, 1, 3, '2012-10-17 12:00:00'),
(3, 2, 2, 3, '2012-10-17 12:00:00'),
(3, 4, 4, 3, '2012-07-09 12:00:00'),
(4, 4, 4, 1, '2012-07-25 12:00:00'),
(4, 4, 4, 2, '2012-07-17 12:00:00'),
(4, 4, 4, 3, '2012-07-09 12:00:00'),
(4, 1, 1, 4, '2012-09-23 12:00:00'),
(4, 2, 2, 4, '2012-08-28 12:00:00'),
(4, 3, 3, 4, '2012-08-03 12:00:00');
产生的错误:
Msg 2627, Level 14, State 1, Line 8
Violation of PRIMARY KEY constraint 'PK__JaretsSc__9C8A5B696CFE9A03'. Cannot insert duplicate key in object 'dbo.JaretsSchedule'. The duplicate key value is (1).
错误消息字面上告诉您问题出在哪里。对于已定义为主键的 ScheduleID
列,您不能多次插入相同的值。这里的解决方法是将此列设为 identity/auto 增量列。然后,在插入时甚至不包含它的值。相反,让 SQL 服务器处理它:
CREATE TABLE JaretsSchedule (
ScheduleID INT NOT NULL IDENTITY PRIMARY KEY,
FieldID INT NOT NULL,
HomeTeamID INT NOT NULL,
AwayTeamID INT NOT NULL,
GameTime DateTime NOT NULL
);
INSERT INTO JaretsSchedule (FieldID, HomeTeamID, AwayTeamID, GameTime)
VALUES
(1, 1, 2, '2012-10-02 12:00:00'),
(1, 1, 3, '2012-10-17 12:00:00'),
(1, 1, 4, '2012-09-23 12:00:00'),
...
另请注意,我按顺序明确列出了作为插入目标的列。这也是最佳实践,避免了以后可能不清楚 VALUES
子句中的数据对应于哪些列的情况。
这个SQL声明有什么问题?
Create table JaretsSchedule
(
ScheduleID Int Primary Key NOT NULL,
FieldID Int NOT NULL,
HomeTeamID Int NOT NULL,
AwayTeamID Int NOT NULL,
GameTime DateTime NOT NULL
);
Insert into JaretsSchedule
Values
(1, 1, 1, 2, '2012-10-02 12:00:00'),
(1, 1, 1, 3, '2012-10-17 12:00:00'),
(1, 1, 1, 4, '2012-09-23 12:00:00'),
(1, 2, 2, 1, '2012-09-12 12:00:00'),
(1, 3, 3, 1, '2012-08-19 12:00:00'),
(1, 4, 4, 1, '2012-07-25 12:00:00'),
(2, 2, 2, 1, '2012-09-15 12:00:00'),
(2, 2, 2, 3, '2012-09-06 12:00:00'),
(2, 2, 2, 4, '2012-08-28 12:00:00'),
(2, 1, 1, 2, '2012-10-02 12:00:00'),
(2, 3, 3, 2, '2012-08-11 12:00:00'),
(2, 4, 4, 2, '2012-07-17 12:00:00'),
(3, 3, 3, 1, '2012-08-19 12:00:00'),
(3, 3, 3, 2, '2012-08-11 12:00:00'),
(3, 3, 3, 4, '2012-08-03 12:00:00'),
(3, 1, 1, 3, '2012-10-17 12:00:00'),
(3, 2, 2, 3, '2012-10-17 12:00:00'),
(3, 4, 4, 3, '2012-07-09 12:00:00'),
(4, 4, 4, 1, '2012-07-25 12:00:00'),
(4, 4, 4, 2, '2012-07-17 12:00:00'),
(4, 4, 4, 3, '2012-07-09 12:00:00'),
(4, 1, 1, 4, '2012-09-23 12:00:00'),
(4, 2, 2, 4, '2012-08-28 12:00:00'),
(4, 3, 3, 4, '2012-08-03 12:00:00');
产生的错误:
Msg 2627, Level 14, State 1, Line 8
Violation of PRIMARY KEY constraint 'PK__JaretsSc__9C8A5B696CFE9A03'. Cannot insert duplicate key in object 'dbo.JaretsSchedule'. The duplicate key value is (1).
错误消息字面上告诉您问题出在哪里。对于已定义为主键的 ScheduleID
列,您不能多次插入相同的值。这里的解决方法是将此列设为 identity/auto 增量列。然后,在插入时甚至不包含它的值。相反,让 SQL 服务器处理它:
CREATE TABLE JaretsSchedule (
ScheduleID INT NOT NULL IDENTITY PRIMARY KEY,
FieldID INT NOT NULL,
HomeTeamID INT NOT NULL,
AwayTeamID INT NOT NULL,
GameTime DateTime NOT NULL
);
INSERT INTO JaretsSchedule (FieldID, HomeTeamID, AwayTeamID, GameTime)
VALUES
(1, 1, 2, '2012-10-02 12:00:00'),
(1, 1, 3, '2012-10-17 12:00:00'),
(1, 1, 4, '2012-09-23 12:00:00'),
...
另请注意,我按顺序明确列出了作为插入目标的列。这也是最佳实践,避免了以后可能不清楚 VALUES
子句中的数据对应于哪些列的情况。