Sqliteman中的别名问题试图创建唯一的ID

时间:2019-12-01 13:06:25

标签: sql sqlite

我正在尝试将此功能从SQL Server转换为Sqlite,我该怎么办?我知道这是不同的,但我做不到。任何信息都会很棒。谢谢

这是代码:

CREATE TABLE "user" (
    "numId" INT IDENTITY(1,1) NOT NULL,
    "prefix" VARCHAR(50) NOT NULL,
    "id" AS ("prefix"+RIGHT('000000'+CAST(ID AS VARCHAR(7)),7))PERSISTED,

谢谢。

1 个答案:

答案 0 :(得分:0)

普通的SQL表称为rowid tables,并且具有唯一的整数作为其主键(INTEGER PRIMARY KEY列是该rowid的别名)。因此,IDENTITY位得到了照顾。

虽然Sqlite 3.31(在撰写本文时为Beta版)支持生成的列,直到具有此功能的版本在接下来的几年中广泛可用,您可以创建添加自定义前缀的VIEW或在重要的每个SELECT中使用它。像这样:

sqlite> CREATE TABLE actual_user(numId INTEGER PRIMARY KEY, prefix TEXT NOT NULL);
sqlite> CREATE VIEW user(numId, prefix, id) AS
   ...> SELECT numId, prefix, printf('%s%07d', prefix, numId) FROM actual_user;
sqlite> INSERT INTO actual_user(prefix) VALUES ('TEST'), ('TEST'), ('TESTX');
sqlite> SELECT * FROM user;
numId       prefix      id
----------  ----------  ------------
1           TEST        TEST0000001
2           TEST        TEST0000002
3           TESTX       TESTX0000003

您还可以使用表的触发器来模拟它,该触发器在插入和更新时更新id值。这更类似于模仿一个持久化(存储在SQLite lingo中)生成的列,而视图则模仿一个虚拟列:

sqlite> CREATE TABLE user(numId INTEGER PRIMARY KEY, prefix TEXT NOT NULL, id TEXT);
sqlite> CREATE TRIGGER user_ai AFTER INSERT ON user
   ...> BEGIN UPDATE user SET id = printf('%s%07d', new.prefix, new.numId) WHERE numId = new.numId; END;
sqlite> CREATE TRIGGER user_au AFTER UPDATE OF numId, prefix ON user
   ...> BEGIN UPDATE user SET id = printf('%s%07d', new.prefix, new.numId) WHERE numId = new.numId; END;
sqlite> INSERT INTO user(prefix) VALUES ('TEST');
sqlite> SELECT * FROM user;
numId       prefix      id
----------  ----------  ------------
1           TEST        TEST0000001
sqlite> UPDATE user SET prefix='APPLE' WHERE numId = 1;
sqlite> SELECT * FROM user;
numId       prefix      id
----------  ----------  ------------
1           APPLE       APPLE0000001