2015-07-31 1 views
1

У меня есть таблица в базе данных SQLite, созданная с помощью кода ниже. Обратите внимание на соединение первичного ключа:SQLite требует дублировать строки на вставке, тогда как ни один не может быть найден

db.create_table(:person_hash) do 
    Integer :person_id 
    Bignum :hash // MD5 hash in hex stored as numeric: hash.to_i(16) 
    primary_key [:person_id, :hash] 
end 

Эта таблица содержит несколько строк уже:

puts db[:person_hash].where(:person_id => 285577).all 
# {:person_id=>285577, :hash=>306607097659338192312932577746542919680} 

Теперь, когда я пытаюсь вставить это:

db[:person_hash].insert({:person_id=>285577, :hash=>306607097659338206333361532286405644297}) 

я получаю это:

SQLite3::ConstraintException: columns person_id, hash are not unique (Sequel::DatabaseError) 

Если строка еще не существует в таблице, как она может быть дубликатом?

Я попытался вставить другой хэш для одного и того же идентификатора человека, и он работал без проблем.

ответ

1

Это, как представляется, ошибка в SQLite:

$ sqlite3 SQLite version 3.8.9 OpenBSD Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> CREATE TABLE person_hash (person_id integer, hash bigint, primary key (person_id, hash)); sqlite> INSERT INTO person_hash VALUES (285577, 306607097659338192312932577746542919680); sqlite> INSERT INTO person_hash VALUES (285577, 306607097659338206333361532286405644297); Error: UNIQUE constraint failed: person_hash.person_id, person_hash.hash

+0

Переданные данные в новую таблицу с суррогатным ПК вместо. Знал, что я могу рассчитывать на тебя. Благодаря! Интересно, что такая ошибка отключает всю функцию составных клавиш, по крайней мере, в ситуации, рассматриваемой здесь, где ПК являются единственными столбцами в таблице. – Seralize

Смежные вопросы