【问题标题】:I am trying to create a table in SQL and keep getting an error我正在尝试在 SQL 中创建一个表并不断收到错误消息
【发布时间】:2019-11-08 05:51:07
【问题描述】:

我正在使用 Teradata SQL 助手创建表。我使用的代码如下:

CREATE TABLE calendar
( 
     CalendarKey INT NOT NULL,
     FullDate DATE NOT NULL,
     DayOfWeek VARCHAR(20) NOT NULL,
     DayOfMonth INT NOT NULL,
     Month VARCHAR(20) NOT NULL,
     Qtr VARCHAR(2) NOT NULL,
     Year VARCHAR(4) NOT NULL

     PRIMARY KEY (CalendarKey)
);

当我尝试执行命令时出现此错误:

[Teradata Database] [3707] 语法错误,在 ',' 和 'Month' 关键字之间应该有类似 'CHECK' 关键字。

有谁知道问题出在哪里?

【问题讨论】:

  • SQL Server (MSSQL) MySQL .. 标记也完全错误.. 正如错误提示 TeraData as RDMS
  • 标签已修复
  • 我不知道带有数据类型和/或索引的 TeraData CREATE TABLE .. 结构。但是在 Year VARCHAR(4) NOT NULL 之后缺少一个逗号。
  • @DaleK 它可能是。我只需要为该记录使用不同的名称吗?
  • @DaleK 它被保留了。我修复了名称并且它起作用了。谢谢!

标签: sql teradata


【解决方案1】:

正如错误所暗示的,month(和year,也是)是 Teradata 中的保留关键字,不能用作列名。

您可以将其双引号(但随后您也必须在每个查询中将其双引号)或者您更改名称。还有一个问题,primary key 约束之前缺少逗号:

CREATE TABLE calendar
( 
     CalendarKey INT NOT NULL,
     FullDate DATE NOT NULL,
     DayOfWeek VARCHAR(20) NOT NULL,
     DayOfMonth INT NOT NULL,
     "Month" VARCHAR(20) NOT NULL,
     Qtr VARCHAR(2) NOT NULL,
     "Year" VARCHAR(4) NOT NULL,

     PRIMARY KEY (CalendarKey)
);

【讨论】:

  • @RaymondNijland:我在 Teradata 工作了 20 多年,相信我,语法是有效的。逻辑主 Key 不同于物理主 Index
  • “我与 Teradata 合作了 20 多年,相信我,语法是有效的。” 很公平,如果 CREATE TABLE ... 是“也无济于事”解释”在手册的两个不同位置......更扩展的location确实也显示了这种结构......
  • @RaymondNijland,您调用的语法是用于创建 主索引,这与 主键 不同。主键、约束等都在括号内。主索引在外面。
  • Offtopic:我们今天第二次来这里......无论如何我已经注意到主 key 和主 index 之间的区别,就像我之前说的从未与 TeraData 合作过,只是说CREATE TABLE .. 在两个手动位置没有帮助,至少可以说令人困惑。无论如何,最后一次陪练很容易解决... @987654328 @我通过删除想要暂时隐藏的问题丢失了问题链接..
  • 您是自己删除了最后一条带有链接的评论,还是被 stackoverflow 警察删除了?正如我在睡觉前注意到的那样,您发表了评论……仍然很奇怪,我找不到我在已删除的最近答案列表中删除的那个问题,所以如果您仍然可以轻松找到该链接并且会很友善足以再次评论它会很棒;-)
【解决方案2】:

试试这个方法

CREATE TABLE calendar (
  CalendarKey INT NOT NULL,
  FullDate DATE NOT NULL,
  DayOfWeek VARCHAR(20) NOT NULL,
  DayOfMonth INT NOT NULL,
  Month VARCHAR(20) NOT NULL,
  Qtr VARCHAR(2) NOT NULL,
  Year VARCHAR(4) NOT NULL
)

ALTER TABLE `calendar` ADD PRIMARY KEY (`CalendarKey`);

【讨论】:

  • 通过两个不同的查询?我试过了,我过去的代码没有错误
  • 是的,每次我运行它,它都说有同样的错误。
  • 看反引号好像是在mysql上运行的。
【解决方案3】:

试试这个,将一个带有 PK 的表作为表定义的一部分

CREATE TABLE calendar
( 
     CalendarKey INT PRIMARY KEY NOT NULL,
     FullDate DATE NOT NULL,
     [DayOfWeek] VARCHAR(20) NOT NULL,
     [DayOfMonth] INT NOT NULL,
     [Month] VARCHAR(20) NOT NULL,
     Qtr VARCHAR(2) NOT NULL,
     [Year] VARCHAR(4) NOT NULL
); 

或者这让主键 PK 带有身份 [自动计数器]

CREATE TABLE calendar
( 
     CalendarKey INT PRIMARY KEY Identity(1,1) NOT NULL,
     FullDate DATE NOT NULL,
     [DayOfWeek] VARCHAR(20) NOT NULL,
     [DayOfMonth] INT NOT NULL,
     [Month] VARCHAR(20) NOT NULL,
     Qtr VARCHAR(2) NOT NULL,
     [Year] VARCHAR(4) NOT NULL
);

- 注意,如果 col 名称是保留关键字,建议使用括号 [],例如 [year]

【讨论】:

  • 那是 SQL Server SQL 方言代码 SQL 标签不代表本网站上的 SQL Server (MSSQL)..
  • 我只是使用了建议的标签。我的错。
  • 方括号中的关键字是 SQL Server 语法,标准 SQL 需要双引号代替(SQL Server 也支持)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2022-12-16
  • 1970-01-01
  • 2019-07-19
  • 2020-07-26
  • 2021-02-03
  • 2020-01-21
相关资源
最近更新 更多