Есть ли способ добавить префикс в поле автоинкремента в sqlite, чтобы при добавлении новых записей значение автоинкремента содержало префикс?
Нет .
Такой столбец является специальным столбцом, который является псевдонимом столбца rowid .Такой столбец ДОЛЖЕН быть целочисленным значением.
Предполагается, что такой столбец действительно предназначен для уникальной идентификации строки.
НО .....
Однако было бы возможно всегда возвращать значение с префиксом, например, используя
SELECT 'prefix'||mycolumn FROM mytable;
Рабочий пример
: -
DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (mycolumn INTEGER PRIMARY KEY, myothercolumn TEXT);
INSERT INTO mytable (myothercolumn) VALUES('Fred'),('Mary'),('Jane'),('andsoon');
SELECT 'myprefix'||mycolumn, myothercolumn FROM mytable;
- Обратите внимание, что нет необходимости в ключевом слове AUTOINCREMENT, которое только накладывает ограничение, но неэффективно AUTOINCREMENT
Результат
Подражая тому, что вы хотите
Можно было бы скопировать то, что вы хотите, например: -
DROP TRIGGER IF EXISTS mytable2manager;
DROP TABLE IF EXISTS mytable2;
CREATE TABLE IF NOT EXISTS mytable2 (mycolumn TEXT, myothercolumn TEXT);
CREATE TRIGGER IF NOT EXISTS mytable2manager AFTER INSERT ON mytable2 BEGIN
UPDATE mytable2 SET mycolumn = 'myprefix'||(SELECT count() FROM mytable2) WHERE rowid = new.rowid;
END;
INSERT INTO mytable2 (myothercolumn) VALUES('Fred'),('Mary'),('Jane'),('andsoon');
SELECT * FROM mytable2;
- Это создает таблицу вместе с TRIGGER, а затем вставляет те же данные, что и выше.
- TRIGGER действует при каждой вставке строки, и в этом случае он имитирует автоматическую генерацию SQLite для rowidЗначение имеет префикс значения
- , которое может альтернативно использовать
SET mycolumn = 'myprefix'||rowid
- Без TRIGGER myстолбец будет нулевым
Результат
Дополнительно
Вы можетедаже у TRIGGER в способе имитации применяются разные префиксы.В следующем примере используется другой префикс, когда значение в myothercolumn начинается с M
: -
DROP TRIGGER IF EXISTS mytable2manager;
DROP TABLE IF EXISTS mytable2;
CREATE TABLE IF NOT EXISTS mytable2 (mycolumn TEXT, myothercolumn TEXT);
CREATE TRIGGER IF NOT EXISTS mytable2manager AFTER INSERT ON mytable2 BEGIN
UPDATE mytable2 SET mycolumn = CASE WHEN substr(new.myothercolumn,1,1) = 'M' THEN 'myprefix' ELSE 'myotherprefix' END||(SELECT count() FROM mytable2) WHERE rowid = new.rowid;
-- UPDATE mytable2 SET mycolumn = 'myprefix'||rowid WHERE rowid = new.rowid;
END;
INSERT INTO mytable2 (myothercolumn) VALUES('Fred'),('Mary'),('Jane'),('andsoon');
SELECT * FROM mytable2;
Результат