Несколько уникальных столбцов в SQLite - PullRequest
0 голосов
/ 05 января 2011

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

Когда я создаю таблицу в 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 совпадают.

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

Спасибо вам!

Ответы [ 2 ]

2 голосов
/ 05 января 2011

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

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 голосов
/ 05 июля 2012

Вы ищете не УНИКАЛЬНЫЙ, а ПЕРВИЧНЫЙ КЛЮЧ.Когда вы устанавливаете PRIMARY KEY (ownerID1, ownerID2, accountKey, argID1), тогда эти 4 значения вместе являются индексом строки.Это означает, что если вы напишите новую строку с этими 4 значениями, равными существующему, она будет перезаписана.Поэтому каждая комбинация из 4 значений может существовать только один раз.

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

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