我在Oracle模式下使用H2。我在表bar
中添加了一列foo
并用值填充它。现在我想回去给列一个NOT NULL
约束。
看一下old Oracle docs的ALTER TABLE
,我首先尝试了这个:
ALTER TABLE foo ALTER COLUMN bar NOT NULL;
H2告诉我,Unknown data type: "NOT" …
。
所以我看一些more recent Oracle documentation的ALTER TABLE
语法,并尝试了这个:
ALTER TABLE foo MODIFY (bar VARCHAR2(255) NOT NULL);
(请注意,我不需要更改类型,但生产图表似乎表明它是必需的。
H2告诉我,Syntax error in SQL statement "ALTER TABLE FOO MODIFY ([*]BAR VARCHAR2(255) NOT NULL) " …
我在这做错了什么?这是H2的Oracle模式中的错误,还是(更有可能)我错过了一些关键的语法? (我实际上并没有在Oracle上尝试过它,但我认为在Oracle模式下H2会支持这么基本的东西。)
人们,请阅读这个问题!我想要Oracle语法。是的,我正在对H2进行测试,因为我想知道H2是否支持Oracle语法!如果您只是告诉我H2语法,那么我怎么知道H2是否支持Oracle语法?
正如您在查询中所述,正确的syntax for Oracle 12.2:
ALTER TABLE foo MODIFY (bar VARCHAR2(255) NOT NULL);
然而,该语句将在没有外部括号的情况下针对Oracle正确执行,这也适用于H2,这将允许您继续。我找到了你的github issue #694,我正在添加一个pull request #703修复。
我不会说H2,但在纯粹的Oracle中它就像
SQL> create table foo (bar varchar2(255));
Table created.
SQL> alter table foo modify bar not null;
Table altered.
SQL>
试着省略括号:
ALTER TABLE foo MODIFY bar VARCHAR2(255) NOT NULL;