我有一个select语句,至少应该只返回唯一的userId。如果没有发生这种情况并且userIds是双倍的,则用户确实输入了非法的内容。
为了说明我们使用简单的SELECT userId, name, FROM USER
。现在,通常您将在表级别创建userId unique / primarykey。仅仅为了这个例子,我们没有。
预期结果将是:
userId name
---------------
1 Roel
2 Joe
3 John
但结果类似于
userId name
---------------
1 Roel
1 Roel
2 Joe
3 John
3 John
是否有可能以这样的方式进行查询:当结果包含多个userIds时,它会产生错误?
答案 0 :(得分:1)
SELECT
UserId, COUNT(*)
FROM
User
GROUP BY
UserId
HAVING
COUNT(*) > 1
从此返回的任何记录都将是存在错误数据的记录。这将是识别何时提出错误的最简单方法,但它不会简单地为您提出一个错误。您可以将上述查询包装到一个过程中,并使用一些逻辑来确定是引发错误还是运行主查询。
答案 1 :(得分:1)
只需添加DISTINCT
即可。它会让你的行变得独一无二。
SELECT DISTINCT userId, name
FROM USER
根据定义,DISTINCT
关键字可用于仅返回不同(不同)的值。
更新1
原因是您没有在表上指定约束。制作这样的表格定义。
CREATE TABLE userList
(
ID INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(50) NOT NULL,
CONSTRAINT id_PK PRIMARY (ID),
CONSTRAINT name_unique UNIQUE (NAME)
)
当您不希望ID
被自动增加时,您可以删除表定义上的AUTO_INCREMENT
字,或者创建一个像这样的表定义
CREATE TABLE userList
(
ID INT NOT NULL,
NAME VARCHAR(50) NOT NULL,
CONSTRAINT id_PK PRIMARY (ID),
CONSTRAINT name_unique UNIQUE (ID, NAME)
)
答案 2 :(得分:0)
好吧,我想这在注册过程中是重要的...所以在允许INSERT之前只计算给定用户名的命中数。
其次使名称列为UNIQUE,然后在INSERT
时得到正确的错误答案 3 :(得分:0)
另一种解决方案是
SELECT *
FROM User
UNION
SELECT *
FROM User
这样做的好处是您不必在SELECT中列出变量。通常,不明确写明列名是不好的,但我认为这种情况是极少数情况下有意义的。