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

问题描述 投票:0回答:1

我试图创建表的默认主键(不自动增量),与甲骨文相似

fk_id varchar2(32) default sys_guid()

所以表的定义是

CREATE TABLE `t_table` (
    `fk_id` TEXT DEFAULT 'select lower(hex(randomblob(16)))' UNIQUE,
    `fv_name`   TEXT,
    PRIMARY KEY(`fk_id`)
);

是的,我得到这个在插入选择为字符串值。

所以有没有使用触发器任何解决方案?谢谢。

sqlite
1个回答
0
投票

使用'select lower(hex(randomblob(16)))'是封闭的子查询作为字符串/文本文字和UNIQUE已指定将工作只有一次(无需为使列主键意味着唯一的)这样的任何后续插入将失败。

假设你想要的默认值是较低的(十六进制的结果(randomblob(16)),那么你不能使用子查询作为值,然后不被视为一个常量。

  • 对于默认条款的目的,如果它不包含子查询,列或表的引用,结合参数,或包含在双引号来代替单quotes.SQL As Understood By SQLite - CREATE TABLE字符串文字的表达被认为是恒定的

相反,你可以删除选择,只是使用表达式,然后将其视为常数。

然而,要做到这一点,你需要坚持

如果列的默认值是在括号中的表达式,则表达式为插入每一行和每一新行中所用的结果中的评估一次。 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`)
);

当然,应该值不是唯一的,这将是越来越有可能,那么这将导致不被插入一行。

© www.soinside.com 2019 - 2024. All rights reserved.