回答

收藏

SQLite中的多个唯一列

技术问答 技术问答 235 人阅读 | 0 人回复 | 2023-09-14

我试图创建一个表,我需要它不允许3个字段相同的行。$ h: {  K/ r9 d& d5 o' C8 a
当我使用SQLLite在Python中创建表时,使用了以下代码,但几乎没有得到任何结果。它通常在写入2条记录后停止,因此显然可以相信它是重复的。: l  k+ ]3 Q# h9 X; U3 t
CREATE TABLE CorpWalletJournal (
8 \" J8 ~1 ?7 [! W0 o8 e) \: r    date INT,
+ X- F; t) \6 S3 P3 d' [' w    refID INT, ) K8 t: k% r# e) M* P6 |4 i5 l/ W
    refTypeID INT,
! B0 i3 n. v0 I0 C9 n/ K% W: D0 p, h    ownerName1 TEXT,
. U0 C  \9 }) e6 n+ N1 U    ownerID1 INT, - V$ R' u: j. {* S8 J
    ownerName2 TEXT, 2 |( z5 B* ?$ l: E% f, v( U2 P
    ownerID2 INT,
' @" O9 F7 Z1 ]  L  k; Z    argName1 TEXT, ) B4 K9 q+ O  ?& c  T) h
    argID1 ID, : z' L; Z/ J: G( r2 n# e
    amount INT, , \* F" ?4 @+ ]* x) K* O
    balance INT, 8 a. s* |+ e+ r, q/ j
    reason TEXT, ; n$ n1 P9 r6 J# D- F3 d. P
    accountKey INT,( b5 K, ?0 i; D% J3 M, Q- p: a
    UNIQUE (ownerID1, ownerID2, accountKey, argID1)
+ x5 ^: x! g/ g6 @7 I);
7 I5 R, r0 O  z因此,我希望数据库不允许在ownerID1,ownerID2,accountKey和argID1相同的记录。
  y* ]0 K7 [$ Q5 G' y/ w$ d$ n% X: Q! w谁能帮我这个忙吗?
; H2 U7 ~/ e3 p! C7 a- k5 z谢谢!
  j3 p$ u4 y$ I2 o- g               
) p4 D# r7 ?) \  G解决方案:
! d) Z, R  A$ {8 U$ f( m# Q               
/ I) @7 ^6 D; w; T. R% h/ a7 @
  k, X& R1 R2 `5 a' n4 i/ w. v# l& c$ F3 G8 |$ Q( W
                我不确定是什么问题。它在这里工作正常:0 Q8 V* @5 v; k, W, @/ T1 ?, t
import sqlite3
1 P, u" \# m) Q5 e# connect to memory-only database for testing/ d5 W3 E6 m/ {; d# t1 x
con = sqlite3.connect('')
' {* N* V/ b, t9 b1 D: b# {5 N. @cur = con.cursor()
. a. `+ ~- Y+ e0 N( y9 v# create the table
9 R+ _/ ^+ _, G: [cur.execute('''
2 z8 w# O' @  q4 w' v. b8 oCREATE TABLE CorpWalletJournal (" r! E* D6 M. a$ B) w
    date INT, refID INT, refTypeID INT, ownerName1 TEXT,
; P6 x  [+ F' U    ownerID1 INT, ownerName2 TEXT, ownerID2 INT, argName1 TEXT, 6 I5 U' E5 W. y. f- v
    argID1 ID, amount INT, balance INT, reason TEXT, accountKey INT,
, b' M0 R& s* Y. y    UNIQUE (ownerID1, ownerID2, accountKey, argID1)
4 b2 F1 d% g9 W* t);
+ _; {- I( g0 z2 p: g5 u4 }''')
; _+ g: }% @, P7 U8 C5 bcon.commit()# Y. N# _- h% M- q. `
insert_sql = '''INSERT INTO CorpWalletJournal " r. P- f  n# J, c3 H1 t, v
(date, refID, refTypeID, ownerName1, ownerID1, ownerName2, ownerID2,
$ _% L2 R- r) i4 ^# T0 D! |argName1, argID1, amount, balance, reason, accountKey)8 k8 x. M: E+ A  R' X/ l. O
VALUES$ O$ S  p9 ?  p# [
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'''/ i7 u9 ^( F9 E+ \
## create 5 rows changing only argID1 - it works:3 \0 m- \* N7 e: x+ V  B. x9 ~
for argid in xrange(5):
7 J- v% C* t5 [2 q    cur.execute(insert_sql, (1, 1, 1, 'a', 1, 'a', 1, 'a', argid, 1, 1, 'a', 1))
. L" t% W9 ]3 a4 `- I+ H( F; hcon.commit()
( i4 N3 K/ q( E) l; F+ t9 p0 e# now try to insert a row that is already there:: o$ c& {1 P. V
cur.execute(insert_sql,  (1, 1, 1, 'a', 1, 'a', 1, 'a', 0, 1, 1, 'a', 1))6 I5 c: k3 @( Z! [. U
我从最后一行得到的错误是:
7 u8 l2 j& o4 ]& E: yTraceback (most recent call last):
+ g8 _; s/ H6 k' d+ |( Z  File "teststdio.py", line 41, in % d4 ?( v7 j' Q
    cur.execute(insert_sql,  (1, 1, 1, 'a', 1, 'a', 1, 'a', 0, 1, 1, 'a', 1)): g7 e( @5 d& O4 N9 e: G1 O0 W$ d
sqlite3.IntegrityError: columns ownerID1, ownerID2, accountKey, argID1
9 c8 g, Z# R3 Q4 P! X    are not unique
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则