我正在尝试将此功能从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,
谢谢。
答案 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