首页 > 解决方案 > 在不使用类型的情况下删除 SQL 查询中的查询

问题描述

我创建了两个表,一个具有原始类型:

CREATE TABLE CARDS_BAD (
suit CHAR(1),
rank VARCHAR(2)
);

另一个有用户定义的类型

CREATE TYPE suits AS ENUM ('♣', '♠', '♥', '♦');     
CREATE TYPE ranks AS ENUM ('2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K', '10', 'A');

CREATE TABLE CARDS_GOOD (
suit suits,
rank ranks
);

如您所见,这两个表将包含扑克牌,使用简单INSERT查询添加卡片。当我尝试从两张表中删除所有等级为 7 或更低的卡片时:

DELETE FROM cards_bad t where t.rank < '7';
DELETE FROM cards_good t where t.rank < '7';

查询可以正常工作,cards_good但也会删除排名10为 in 的卡片cards_bad,但我希望结果是一样的。有人可以向我解释为什么它不同吗?另外,假设我想将INSERT一张JOKER牌放入牌组(其中有 Jo 但没有花色),为什么这不起作用?

标签: mysqlsqldatabase

解决方案


表之间有一个明显的区别:cards_good依赖枚举类型来存储ranks,而cards_bads使用varchar()

在进行字符串比较时,'10' < '7', 因为'10'以 开头'1',小于'7'

另一方面,虽然比较enums 似乎在您的用例中有效,但我不保证它可以始终如一地工作。

一个可能更安全的选择是创建一个查找表,为每个rank.


在百搭牌上,它有一个等级,但没有花色:就问题而言,suit它不是您表中的必填列,因此没有什么可以阻止您插入带有一suit组 to的牌null


推荐阅读