在下面的代码中,实际显示在DB中的唯一提交是找到的最后一个'idn'。 idn只是一个识别号码,可以计算每个客户有多少个机顶盒。因此,如果idn 1,2和3都存在,它只会在DB 1,2和3右边写入3。如果idn 1是唯一存在的,那么它就会被写入。谢谢你的帮助!
if "STBSINFO||" in line:
head, sep, tail = line.partition('STBSINFO||')
idn = idn + 1
if "|" in tail:
head, sep, tail = tail.partition('|')
#Creates the mac address variable from the partition
mac = head
if "|" in tail:
head, sep, tail = tail.partition('|')
#Gathers the IP of the given set top box
stbip = head
if idn == 1:
cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb1) VALUES (?,?)", (cid, stbip))
conn.commit()
elif idn == 2:
cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb2) VALUES (?,?)", (cid, stbip))
conn.commit()
elif idn == 3:
cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb3) VALUES (?,?)", (cid, stbip))
conn.commit()
elif idn == 4:
cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb4) VALUES (?,?)", (cid, stbip))
conn.commit()
答案 0 :(得分:0)
如果cid
是主键,或者对其有一些其他唯一性约束(如示例中所示),则不能有多个具有相同cid
的行。因此,当您INSERT OR REPLACE
行与前一行具有相同的cid
时,它将只替换上一行。
例如:
sqlite> CREATE TABLE packages (cid PRIMARY KEY, mstb1, mstb2, mstb3, mstb4);
sqlite> INSERT INTO packages (cid, mstb1) values (1, 1);
sqlite> INSERT OR REPLACE INTO packages (cid, mstb2) values (1, 2);
sqlite> SELECT * FROM packages;
cid|mstb1|mstb2|mstb3|mstb4
1||2||
这正是您的计划中发生的事情。您插入行1|1|||
,然后将其替换为行1||2||
,然后将其替换为行1|||3|
。并不是说只有一行被写入,而是每一行都替换了它之前的一行,所以最后,你只需要用你最后写的那一行。
如果您尝试更新该行,请使用UPDATE
语句,而不是INSERT OR REPLACE
:
sqlite> UPDATE packages SET mstb1=1 WHERE cid=1;
sqlite> SELECT * FROM packages;
cid|mstb1|mstb2|mstb3|mstb4
1|1|2||
如果您尝试创建两个单独的行,那么您的架构设置错误;如果您想要两个具有相同cid
的不同行,则cid
不能是唯一键。也许您希望所有五列的集合在这种情况下成为关键?
sqlite> CREATE TABLE packages (cid NOT NULL, mstb1, mstb2, mstb3, mstb4, PRIMARY KEY(cid, mstb1, mstb2, mstb3, mstb4));
sqlite> INSERT INTO packages (cid, mstb1) values (1, 1);
sqlite> INSERT INTO packages (cid, mstb2) values (1, 2);
sqlite> SELECT * FROM packages;
cid|mstb1|mstb2|mstb3|mstb4
1|1|||
1||2||
INSERT
,ON CONFLICT
和UPDATE
上的文档更详细地解释了这些内容。
但是,我认为在参考文档很有意义之前,您需要一个关于SQL数据库的基础教程。