1

3つのフィールドが同じである行を許可しないようにするために必要なテーブルを作成しようとしています。

SQLLiteを使用してPythonでテーブルを作成するときは、次のように使用しますが、ほとんど結果が得られません。通常、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が同じであるレコードをデータベースで許可しないようにします。

誰かがこれを手伝ってくれる?

ありがとうございました!

4

2 に答える 2

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
于 2011-01-05T13:39:59.637 に答える
0

あなたはUNIQUEを探しているのではなく、PRIMARYKEYを探しています。PRIMARY KEY(ownerID1、ownerID2、accountKey、argID1)を設定すると、この4つの値が一緒になって行インデックスになります。つまり、この4つの値を既存の値と同じにして新しい行を書き込むと、その行が上書きされます。したがって、4つの値のすべての組み合わせは1回だけ存在できます。

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

于 2012-07-04T23:48:58.613 に答える