SQLite:Return 如果在 table 中发现重复值则为真

SQLite : Return true if duplicate values are found in table

我想知道如何在 table 中找到重复值并使其 return 为真。我已经看到很多关于此的问题,但其中 none 帮助了我,谢谢!

这是我的例子:

import hashlib
import sqlite3

con = sqlite3.connect('users/accounts.db')
cur = con.cursor()
info = cur.execute("SELECT * FROM accounts;").fetchall()

print("Sign Up.")
username = input("Input your username : ")
password = input("Input your password : ")
email = input("Input your email: ")

result = hashlib.sha256(password.encode("utf-8"))
result_2 = str(result.digest)

cur.execute("insert into accounts (username, password, email) values(?,?,?)", (username, result_2, email))

con.commit()
print(info)
con.close()

免责声明

对于那些想知道的人,不,这不会在生产环境中使用,它不安全并且很容易被利用。甚至没有在哈希上加盐。

假设你有这个 table:

create table foo (
   foo_id numeric(12,0) primary key,
   str_value varchar(200)
);

并且您想查找 str_value 的重复值。

你可以这样做:

select str_value
  from foo
 group by str_value
having count(1) > 1;

您将得到一个 str_values 的列表,上面有重复项。

如果您想知道每个 str_value 有多少重复项,您可以将 count(1) 添加到 select 子句中:

select str_value, count(1)
  from foo
 group by str_value
having count(1) > 1;

如果您的目标是防止插入新的用户记录,其中的用户名或电子邮件已被其他人使用,那么现有查询提供了一个选项:

INSERT INTO accounts (username, password, email)
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT 1 FROM accounts WHERE username = ? OR email = ?);

也就是说,在一条语句中,我们还可以检查提供的用户名或电子邮件是否已经出现在 accounts table.

中的某处

已更新 Python 代码:

sql = """
    INSERT INTO accounts (username, password, email)
    SELECT ?, ?, ?
    WHERE NOT EXISTS (SELECT 1 FROM accounts WHERE username = ? OR email = ?)
"""
cur.execute(sql, (username, result_2, email, username, email))

所以这段代码有效

b = cur.execute("select * from accounts").fetchall()

sql = """INSERT INTO accounts (username, password, email)
         SELECT ?, ?, ?
         WHERE NOT EXISTS (SELECT 1 FROM accounts WHERE username = ? OR email = ?)"""
cur.execute(sql, (username, str(result.digest()), email, username, email))

a = cur.execute("select * from accounts").fetchall()

if a > b:
    print("Registration Complete.")
else:
    print("Failed : Username or Email already exists.")