【问题标题】:ADD vs. ADD COLUMN in SQLite?在 SQLite 中添加与添加列?
【发布时间】:2023-03-30 05:28:01
【问题描述】:

我正在尝试在数据库升级方法中将新列添加到预先存在的表中。我见过两种方法:

ALTER TABLE foo ADD new_column INTEGER DEFAULT 0

ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0

有什么区别?

【问题讨论】:

  • COLUMN 关键字是可选的。完全没有区别。
  • @ZoharPeled 很想知道你是怎么知道的;我在sqlite.org/lang_altertable.html 上看到流程图,这是哪里?
  • 我知道这一点是因为两个版本的功能完全相同。自己试试看。
  • 好的,谢谢。我确实对它们都进行了测试(这就是我提出这个问题的原因),但不知道是否在我遗漏的某个地方对架构做了一些额外的事情。但是,很高兴知道!再次感谢
  • 再看一下那个页面——“铁路图”确实表明COLUMN是可选的。

标签: sql sqlite syntax


【解决方案1】:

COLUMN 关键字是可选的。完全没有区别。

试试下面的脚本:

CREATE TABLE Test
(
    Col1 INTEGER
);

INSERT INTO Test (Col1) VALUES (1);

ALTER TABLE Test 
ADD Col2 INTEGER NULL;

ALTER TABLE Test 
ADD COLUMN Col3 INTEGER NULL;

SELECT * 
FROM Test

结果将是:

Col1    Col2    Col3
1

【讨论】:

  • 考虑性能(例如数百万条 SQL 语句),或支持的广泛程度(跨越数十个数据库系统,包括同一数据库的不同版本)等问题......有没有 真的没有区别吗?如果这是真的,那将是最令人惊讶的。
  • @AlainD 我完全赞成吹毛求疵,但你已经把它带到了一个全新的水平......首先,我发现很难想象一个你不愿意考虑性能问题的场景alter table 声明。这通常不是运行时操作,如果您在循环中使用它(例如数百万条 SQL 语句) - 您可能做错了。其次,关于包括不同版本在内的数十个数据库系统的广泛支持-问题是指特定的数据库,因此无关紧要。 (虽然没有提到版本,但我会同意你的。)
  • 勘误表:您的意思是“拥有”,而不是“讨厌”。我的评论并不意味着批评,但确实有两个严肃的观点:(a)如果你足够挑剔,就会有区别,以及(b)“广泛”的数据库版本和系统相关的,尽管 OP 通常只提到 SQLite - 人们从许多来源和网络搜索中得出这个问题。该问题与 SQL-92 一致性(即许多数据库系统和同一数据库系统的版本)具有普遍相关性。
  • 是的,这是一个错字(讨厌而不是拥有。我责怪自动打字)。但我仍然不同意你对你广泛主张的看法。 S.O 使用标签来聚焦问题,答案应该与问题上的标签相关。例如,如果 Sql 问题使用 MySql 标记,则不应使用 Sql Server 代码回答。
  • 同意,但也许您错过了我评论的要点?另一个问题最近已关闭并重新定向到此处。将其标记为重复是不完美的(封闭的问题是不同的,并解决了 SQL-92 合规性超出SQLiteAccess)。这个问题除了sqlite 之外还有sql 标记,基本上是关于SQL-92 语法的。当然,仅解决 SQLite可能是一个过于狭隘的焦点。绝对不是对原始答案的批评!
【解决方案2】:

COLUMN 不是 SQL 规范要求的,但它是首选。通过规范的专有扩展,表可以有其他东西你可以ADD。规范没有告诉您可以做什么,因此最好明确说明。

实际的BNF grammar in the SQL-92 spec is,

<alter table statement> ::=
    ALTER TABLE <table name> <alter table action>

<alter table action> ::=
    <add column definition>
    | <alter column definition>
    | <drop column definition>
    | <add table constraint definition>
    | <drop table constraint definition>

<add column definition> ::=
    ADD [ COLUMN ] <column definition>

[ ] 中的内容是可选的。

对于需要column definition 的其他类似命令也是如此,例如ALTER COLUMNDROP COLUMN

<alter column definition> ::=
    ALTER [ COLUMN ] <column name> <alter column action>

<drop column definition> ::=
    DROP [ COLUMN ] <column name> <drop behavior>

从另一个答案中复制,关于一个被标记为重复的问题

【讨论】:

    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 2015-08-22
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多