1、Derby主要遵循SQL_92标准,支持部分SQL_99标准。
2、预编译SQL语句依赖数据字典对象,当对应的数据字典对象被修改后,SQL将被重新编译。因为编译一般发生在SQL第一次被执行时,所以当编译失败了,执行的请求也就随之失败。
3、ALTER TABLE语句
增/删列或者约束条件、修改VARCHAR列或者VARCHAR FOR BIT DATA列的长度、修改行级锁、修改标识列的增量值、设定标识列下一次生成的开始值、修改列是否可为null以及列的默认值。
只能对标识列进行增量值修改操作。
标记列生成时如果指定为"GENERATER BY DEFAULT",那么该列同时允许手动或者系统生成值,这样一来会导致手动插入的值与系统自动生成的值冲突。
- CREATE TABLE tauto(i INT GENERATED BY DEFAULT AS IDENTITY, k INT)
- CREATE UNIQUE INDEX tautoInd ON tauto(i)
- INSERT INTO tauto(k) values 1,2
- INSERT INTO tauto VALUES (3,3)
- INSERT INTO tauto VALUES (4,4)
- INSERT INTO tauto VALUES (5,5)
- INSERT INTO tauto(k) values 6
最后一条插入语句就将失败,因为系统自动生成的值将为3,与手动插入的记录冲突。而这时通过设定标记列开始值来解决,
- ALTER TABLE tauto ALTER COLUMN i RESTART WITH 6
ALTER TABLE的执行不会影响视图,所以如果需要同步,必须重新生成视图。
Derby不支持修改列的数据类型以及添加列时使用DEFAULT子句
本节至此,"Derby also raises an error if you try to add a DEFAULT clause to a generated column."这句话实在没看懂,有知道,告诉一声啊,谢谢。出处:http://db.apache.org/derby/docs/dev/ref/rrefsqlj81859.html
添加新列,几乎与CREATE TABLE语句没有区别。只有在指定列为NOT NULL时,有一点特殊,就是必须同时设定DEFAULT子句,这样之前存在的记录才会自动添加值,否则会抛出异常。
可以添加所有表级别的约束,但会先检查约束的列是否符合约束。如不符合,则添加失败并抛出异常。
删除列,分为级连删除(CASCADE)与约束式删除(RESTRICT),默认为级连。指定为约束式时,不能删除被依赖的列;指定为级连时,则会额外删除依赖该列的其它数据集。如:视图、触发器、主键约束、外键约束、值唯一性约束、检查约束和列级权限。(a schema object:views, triggers, primary key constraints, foreign key constraints, unique key constraints, check constraints, and column privileges)但无论是级连还是约束式删除,都不会给索引面子,指定删除那列就会删除那列。如果该列在索引中,则从索引中删除,如果该列为索引中的唯一列,则连索引也一并删了。无论如何,不可能删除表的最后一列。
删除约束,原先没命名的可以通过在SYS.SYSCONSTRAINTS中找到对应的名字进行删除;而对于主键、值唯一性以及外键等约束,直接删除对应索引就行了。
列的数据类型不允许修改,而VARCHAR和VARCHAR FOR BIT DATA对于长度的修改,只允许增加,不允许减少。当该列为主键、被外键约束依赖的值唯一性列或者本身为外键约束,则不允许对长度进行任何修改。
在数据库系统默认锁为行级锁时,LOCKSIZE子句允许对行级锁进行变更。如果此时默认是表级别的,是不允许进行行级锁变更操作的。如施行了操作,Derby对于这种情况默许而不抛出异常。当然,操作结果肯定是失败的。除此之外,你可以在行级别/表级别锁之间通过LOCKSIZE任意进行切换。