【问题标题】:What's wrong with this SQL CREATE + INSERT batch?这个 SQL CREATE + INSERT 批处理有什么问题?
【发布时间】:2019-12-24 02:38:51
【问题描述】:

这条 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');

结果错误:

消息 2627,第 14 级,状态 1,第 8 行
违反主键约束“PK__JaretsSc__9C8A5B696CFE9A03”。无法在对象“dbo.JaretsSchedule”中插入重复键。重复键值为 (1)。

【问题讨论】:

  • 有4个团队,4个领域,4个赛程。
  • 错误消息实际上是在告诉您问题所在。您不能多次插入相同的ScheduleID 值。检查你插入数据。
  • 我重命名了这个问题,因为 SQL Server 没有实现古老而过时的 IBM 语言“Sequel”。相反,它实现了 SQL。 2019 年的今天 SQL 与 1970 年代的 Sequel 完全不同。
  • 您对主键使用相同的值,即错误,如错误消息所指定。

标签: sql ssms create-table


【解决方案1】:

错误消息实际上是在告诉您问题所在。您不能为已定义为主键的 ScheduleID 列多次插入相同的值。此处的解决方法是仅将此列设为标识/自动增量列。然后,插入时甚至不要包含它的值。相反,让 SQL Server 处理它:

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 子句中的数据对应于哪些列的情况。

【讨论】:

  • 我对数据库很陌生。谢谢,我会看看如何使它成为“身份/自动增量列”
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多