mysql - 在不使用类型的情况下删除 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 但没有花色),为什么这不起作用?
解决方案
表之间有一个明显的区别:cards_good
依赖枚举类型来存储rank
s,而cards_bads
使用varchar()
。
在进行字符串比较时,'10' < '7'
, 因为'10'
以 开头'1'
,小于'7'
。
另一方面,虽然比较enum
s 似乎在您的用例中有效,但我不保证它可以始终如一地工作。
一个可能更安全的选择是创建一个查找表,为每个rank
.
在百搭牌上,它有一个等级,但没有花色:就问题而言,suit
它不是您表中的必填列,因此没有什么可以阻止您插入带有一suit
组 to的牌null
。
推荐阅读
- javascript - 内
- onClick 不会触发
- javascript - 如何编译时检查 vue 模板中的强类型道具?
- ios - 如何在 Xamarin iOS 中播放 .MOV 文件
- api - Hashicorp Nomad 和 Consul API - 获取所有服务地址
- javascript - 我怎样才能修复这个按钮
- android - Android OkHttpClient 改造和缓存问题
- jenkins - Jenkins 中的通用 Webhook 触发器插件问题
- swift - 应用程序从挂起状态返回后无法从 AVPlayer 播放
- python - 检查列表是否包含特定序列的项目
- reactjs - 如何将图像插入状态(React)