2011-01-05 2 views
0

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

Когда я создаю таблицу в Python с помощью SQLLite, я использую следующую, но я почти ничего не получаю. Обычно он останавливается после записи 2 записей, поэтому что-то, очевидно, верит в его дублирование.

CREATE TABLE CorpWalletJournal (
    date INT, 
    refID INT, 
    refTypeID INT, 
    ownerName1 TEXT, 
    ownerID1 INT, 
    ownerName2 TEXT, 
    ownerID2 INT, 
    argName1 TEXT, 
    argID1 ID, 
    amount INT, 
    balance INT, 
    reason TEXT, 
    accountKey INT, 

    UNIQUE (ownerID1, ownerID2, accountKey, argID1) 
); 

Итак, я хотел бы базу данных, чтобы не допустить записи, где ownerID1, ownerID2, accountKey и argID1 являются одинаковыми.

Может ли кто-нибудь помочь мне с этим вообще?

Спасибо!

+0

* Обычно он останавливается после записи 2 записей, поэтому что-то очевидно верят в его дублирование. * - Почему это очевидно? Какое сообщение об ошибке вы получаете, когда вставка выходит из строя? –

+1

Вы не указали 'NOT NULL' на любых столбцах, так что, возможно, вы получаете нулевые значения, которые нарушают уникальное ограничение. Как выглядят данные после сбоя вставки? – Hollister

ответ

2

Я не уверен, в чем проблема. Он отлично работает здесь:

import sqlite3 

# connect to memory-only database for testing 
con = sqlite3.connect('') 
cur = con.cursor() 

# create the table 
cur.execute(''' 
CREATE TABLE CorpWalletJournal (
    date INT, refID INT, refTypeID INT, ownerName1 TEXT, 
    ownerID1 INT, ownerName2 TEXT, ownerID2 INT, argName1 TEXT, 
    argID1 ID, amount INT, balance INT, reason TEXT, accountKey INT, 
    UNIQUE (ownerID1, ownerID2, accountKey, argID1) 
); 
''') 
con.commit() 

insert_sql = '''INSERT INTO CorpWalletJournal 
(date, refID, refTypeID, ownerName1, ownerID1, ownerName2, ownerID2, 
argName1, argID1, amount, balance, reason, accountKey) 
VALUES 
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''' 

## create 5 rows changing only argID1 - it works: 
for argid in xrange(5): 
    cur.execute(insert_sql, (1, 1, 1, 'a', 1, 'a', 1, 'a', argid, 1, 1, 'a', 1)) 
con.commit() 

# now try to insert a row that is already there: 
cur.execute(insert_sql, (1, 1, 1, 'a', 1, 'a', 1, 'a', 0, 1, 1, 'a', 1)) 

Ошибки я получаю от последней строки:

Traceback (most recent call last): 
    File "teststdio.py", line 41, in <module> 
    cur.execute(insert_sql, (1, 1, 1, 'a', 1, 'a', 1, 'a', 0, 1, 1, 'a', 1)) 
sqlite3.IntegrityError: columns ownerID1, ownerID2, accountKey, argID1 
    are not unique 
0

Ваш не ищет UNIQUE, но для первичного ключа. Когда вы устанавливаете PRIMARY KEY (ownerID1, ownerID2, accountKey, argID1), то эти 4 значения вместе являются индексом строки. Это означает, что если вы напишете новую строку с этими 4 значениями, равными существующей, она перезапишет эту. Поэтому каждая комбинация из 4 значений может существовать только один раз.

UNIQUE, с другой стороны, означает, что каждый из 4 значений можно использовать только один раз.

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