Почему он дублирует вставку с использованием sqlite? - PullRequest
0 голосов
/ 24 декабря 2018

Вот моя схема таблицы базы данных,

S_DB_Column _db_ott_option[N_DB_OTT_OPTION] = 
{   
    {"int",         "ott_param_type",               "%d"},  
    {"int",         "ott_param_id",                 "%d"},  
    {"int",         "ott_param_value",              "%d"},  
    {"char (128)",  "ott_param_name",               "%Q"},      
};

Я хочу управлять pid субтитров фильма в db.БД использовал автоинкремент.

пример, мой запрос ниже,

insert or replace into _ottsubt ( ott_param_type, ott_param_id, ott_param_value, ott_param_name ) values ( 0, 9291, 8190, 'Movie 1' );

insert or replace into _ottsubt ( ott_param_type, ott_param_id, ott_param_value, ott_param_name ) values ( 0, 9291, 260, 'Movie 1' );

запись дублируется в таблице,

Я хочу обновить, если такая же запись существует ихотите вставить, если такая же запись не существует.

1 Ответ

0 голосов
/ 24 декабря 2018

Ваша проблема в том, что ни один из вставляемых столбцов не имеет УНИКАЛЬНОГО ограничения.

Я полагаю, что вы хотите использовать следующую таблицу для создания таблицы: -

create table if not exists _ottsubt(id INTEGER PRIMARY KEY, ott_param_type int, ott_param_id int UNIQUE, ott_param_value int, ott_param_name char (128));

Тогда сработает вышеуказанное.

Рабочий пример: -

drop table if exists _ottsubt;
create table if not exists _ottsubt(id INTEGER PRIMARY KEY AUTOINCREMENT, ott_param_type int, ott_param_id int UNIQUE, ott_param_value int, ott_param_name char (128));
insert or replace into _ottsubt ( ott_param_type, ott_param_id, ott_param_value, ott_param_name ) values ( 0, 9291, 8190, 'Movie 1' );
insert or replace into _ottsubt ( ott_param_type, ott_param_id, ott_param_value, ott_param_name ) values ( 0, 9291, 260, 'Movie 1' );
SELECT * FROM _ottsubt;

Результат: -

enter image description here


В качестве альтернативы вы можете удалить столбец id и вместо него сделать ott_parm_id col ПЕРВИЧНЫЙ КЛЮЧ, используя (и псевдоним rowid ): -

create table if not exists _ottsubt(ott_param_type int, ott_param_id int INTEGER PRIMARY KEY, ott_param_value int, ott_param_name char (128));
  • Примечание AUTOINCREMENT был удален, он, вероятно, не требуется ион неэффективен в соответствии с автоинкрементом SQLite , который включает в себя: -

Ключевое слово AUTOINCREMENT накладывает дополнительные ресурсы ЦП, памяти, дискового пространства и дискового ввода-вывода и должно бытьизбегать, если не строго необходимо.Обычно это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...