将查询结果设置为默认列值而不使用触发器

时间:2019-02-02 14:59:21

标签: sqlite

我正在尝试使用默认主键(不是自动增量)创建表,类似于oracle

Add Existing

所以表定义是

fk_id varchar2(32) default sys_guid()

是的,我在插入时将此选择作为字符串值。

那么有什么不使用触发器的解决方案吗? 谢谢。

1 个答案:

答案 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`)
);

当然,该值不是唯一的,这种可能性将越来越大,这将导致未插入该行。