سؤال

أنا أحاول إنشاء جدول حيث كنت في حاجة إليها لا تسمح الصفوف حيث 3 مجالات هي نفسها.

عند إنشاء الجدول في بيثون باستخدام 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 هي نفسها.

يمكن لأي شخص أن يساعدني مع كل هذا ؟

شكرا-لك!

هل كانت مفيدة؟

المحلول

لست متأكدًا من المشكلة. يعمل بشكل جيد هنا:

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

نصائح أخرى

أنت لا تبحث عن فريدة من نوعها ، ولكن المفتاح الأساسي.عند تعيين مفتاح أساسي (ownerID1, ownerID2, accountKey, argID1) ، ثم هذا 4 القيم معا الصف مؤشر.هذا يعني أنه إذا كنت تكتب صف جديد مع هذه 4 قيم المساواة الحالية ، فإنه سيتم الكتابة فوق هذا واحد.ولذلك كل مجموعة من 4 قيم يمكن أن توجد إلا مرة واحدة.

فريدة من نوعها من ناحية أخرى ، ما يعني أن كل من 4 القيم يمكن أن تستخدم إلا مرة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top