我有一個表,其中我將一些標題存盤為 TEXT,日期也存盤為 TEXT。
我將日期值作為 ISO 格式的字串插入資料庫中。
現在我想要一個唯一的標題和日期組合,但只考慮 ISO 字串的日期部分(年、月和日)而忽略時間部分。所以我想要一年中的每一天都有一個獨特的標題。
例子:
INSERT INTO TABLE_A (TITLE, DATE) VALUES ('TITLE_A', '2022-06-20T13:53:41.680Z') -- OK
INSERT INTO TABLE_A (TITLE, DATE) VALUES ('TITLE_A', '2022-06-20T22:12:32.430Z') -- NOT OK same title and only time is different
INSERT INTO TABLE_A (TITLE, DATE) VALUES ('TITLE_B', '2022-06-20T13:53:41.680Z') -- OK same date but title is different
我最好的選擇是什么?我可以實施檢查,但我不確定這是否是最佳選擇,因為隨著表格的增長,這可能會使檢查變慢。
uj5u.com熱心網友回復:
SQLite 不允許在UNIQUE約束定義中使用函式,這樣可以解決如下問題:
UNIQUE(TITLE, date(DATE)) -- not allowed
相反,您可以將生成的列(版本 3.31.0 )定義為列的日期部分,DATE并在約束的定義中使用它。
將現有列重命名為TIMESTAMP并將生成的列命名為DATE:
CREATE TABLE TABLE_A (
TITLE TEXT,
TIMESTAMP TEXT,
DATE TEXT GENERATED ALWAYS AS (date(TIMESTAMP)),
UNIQUE(TITLE, DATE)
);
INSERT INTO TABLE_A (TITLE, TIMESTAMP) VALUES ('TITLE_A', '2022-06-20T13:53:41.680Z'); -- OK
INSERT INTO TABLE_A (TITLE, TIMESTAMP) VALUES ('TITLE_A', '2022-06-20T22:12:32.430Z'); -- error
INSERT INTO TABLE_A (TITLE, TIMESTAMP) VALUES ('TITLE_B', '2022-06-20T13:53:41.680Z'); -- OK
實際上,生成的列DATE實際上并未存盤在表中。
uj5u.com熱心網友回復:
您可以維護一個純日期列,然后對標題和日期的組合施加唯一約束。
CREATE TABLE TABLE_A (
TITLE VARCHAR NOT NULL,
DATE VARCHAR NOT NULL,
TIMESTAMP VARCHAR NOT NULL,
CONSTRAINT c_unique UNIQUE (TITLE, DATE)
);
INSERT INTO TABLE_A (TITLE, DATE, TIMESTAMP)
VALUES ('TITLE_A', '2022-06-20', '2022-06-20T13:53:41.680Z') -- passes
INSERT INTO TABLE_A (TITLE, DATE, TIMESTAMP)
VALUES ('TITLE_A', '2022-06-20', '2022-06-20T22:12:32.430Z') -- fails
INSERT INTO TABLE_A (TITLE, DATE, TIMESTAMP)
VALUES ('TITLE_B', '2022-06-20', '2022-06-20T13:53:41.680Z') -- passes
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494303.html
