2011-01-05 8 views
0

3つのフィールドが同じである行を許可しないテーブルを作成しようとしています。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のためにされていません。 PRIMARY KEY(ownerID1、ownerID2、accountKey、argID1)を設定すると、この4つの値が一緒に行インデックスになります。 つまり、この4つの値を既存の値と同じ値にして新しい行を書き込むと、その値が上書きされます。したがって、4つの値の組み合わせはすべて1回しか存在できません。

UNIQUEは、4つの値のそれぞれを1回しか使用できないことを意味します。