Я пытаюсь создать настраиваемый идентификатор или уникальный идентификатор, например SID0000001, но возникает ошибка: ‘(‘ , ‘)’, или ожидаемая запятая, получил ‘ ‘

#android-studio #android-sqlite

#java #android-studio #android-sqlite

Вопрос:

Итак, это была ошибка, возникшая на CON_SID "AS 'SID' RIGHT('000000' CAST(ID AS VARCHAR(6)),6)PERSISTED);";

 @Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE "   TBL_Name  
            " ("  CON_ID   "INT IDENTITY(1,1) NOT NULL PRIMARY KEY AUTOINCREMENT, " 
            CON_Name   " TEXT, "  
            CON_Address   " TEXT, "  
            CON_BDay   " TEXT, "  
            CON_Gender   " TEXT, "  
            CON_Course   " TEXT, "  
            CON_SID   "AS 'SID'   RIGHT('000000'   CAST(ID AS VARCHAR(6)),6)PERSISTED);";
    db.execSQL(query);
}
 

Комментарии:

1. ИДЕНТИФИКАТОР, ВЕРНО, СОХРАНЯЕТСЯ, ни один из них не поддерживается SQLite.

2. Знаете ли вы какой-нибудь другой способ создать идентификатор, подобный SID00001 (идентификатор школы).

Ответ №1:

Вы не можете использовать диалект SQL MYSQL. Однако вы можете имитировать результат, используя ТРИГГЕР (не то, что вам нужно — объяснено ниже), например :-

Сначала создайте таблицу (имена на основе вашего вопроса), например :-

 CREATE TABLE IF NOT EXISTS example (
    id INTEGER PRIMARY KEY, 
    name TEXT, 
    address TEXT, 
    bday TEXT, 
    gender TEXT, 
    course TEXT, 
    sid TEXT UNIQUE
);
 

Затем добавьте ТРИГГЕР с помощью :-

 CREATE TRIGGER IF NOT EXISTS example_after_insert AFTER INSERT ON example 
BEGIN
    UPDATE example SET sid = 'SID'||substr('000000',1,6-length(id))||id WHERE id = new.id;
END
;
 

Затем SID будет генерироваться всякий раз, когда вставляется строка. Например :-

 /* INSERT rows where id column is generated by SQLite */
INSERT INTO example (name,address,bday,gender,course) VALUES
    ('name1','addr1','bday1','female','course1'),
    ('name2','addr2','bday2','male','course2'),
    ('name3','addr3','bday3','female','course3')
;
/* INSERT rows with specific ID's to test values */
INSERT INTO example (id,name,address,bday,gender,course) VALUES
    (15,'name1','addr1','bday1','female','course1'),
    (135,'name2','addr2','bday2','male','course2'),
    (1234,'name3','addr3','bday3','female','course3'),
    (98765,'name3','addr3','bday3','female','course3'),
    (999999,'name3','addr3','bday3','female','course3'),
    (9999999,'name3','addr3','bday3','female','course3') /* overflow */
;
 

Использование SELECT * FROM example; then показывает :-

введите описание изображения здесь

Не то, что вам нужно

Вы могли бы достичь того же результата без триггера, просто сгенерировав столбец, когда это необходимо.

  • Такой подход даст следующие преимущества
    • уменьшите требуемое пространство для хранения
    • уменьшите обработку, требуемую при вставке строки
      • нет дополнительного столбца
      • нет триггера и обновления
      • никакой дополнительной проверки конфликта индексов
    • лучше соответствовать нормализации (не дублировать данные)

Например, чтобы получить тот же результат без доступа к столбцу sid (т. Е. Показать, Что он не нужен), вы могли бы использовать (сгенерированный столбец был назван SchoolID ):-

 SELECT 
    id,
    name,
    address,
    bday,
    gender,
    course, 
    'SID'||substr('000000',1,6-length(id))||id AS schoolID 
FROM example;
 

Результат :-

введите описание изображения здесь