我正在尝试使用默认主键(不是自动增量)创建表,类似于oracle
Add Existing
所以表定义是
fk_id varchar2(32) default sys_guid()
是的,我在插入时将此选择作为字符串值。
那么有什么不使用触发器的解决方案吗? 谢谢。
答案 0 :(得分:0)
使用'select lower(hex(randomblob(16)))'
是包围所述子查询作为字符串/文本文字和将工作仅作为UNIQUE已指定(无需为使得柱PRIMARY KEY意味着UNIQUE)一旦从而任何后续插入将失败。
假设您希望DEFAULT值是 lower(hex(randomblob(16))的结果,则您不能使用子查询,因为该值将不被视为常量。
有关DEFAULT子句的目的,表达被认为是 常量如果它不包含子查询,列或表引用, 绑定参数,或用双引号引起来的字符串文字 的单引号。SQL As Understood By SQLite - CREATE TABLE
相反,您可以删除选择并仅使用表达式,然后将其视为CONSTANT。
不过,要做到这一点,你需要坚持
如果列的默认值是在的括号,然后表达 该表达式评估一次用于插入每个行和结果 在新行中使用。 SQL As Understood By SQLite - CREATE TABLE
因此可以使用: -
CREATE TABLE IF NOT EXISTS `t_table` (
`fk_id` TEXT DEFAULT (lower(hex(randomblob(16)))) UNIQUE,
`fv_name` TEXT,
PRIMARY KEY(`fk_id`)
);
当然,该值不是唯一的,这种可能性将越来越大,这将导致未插入该行。