社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

mysql忽略check约束

Yushey • 5 年前 • 1149 次点击  

我有这段代码,我想在mysql中实现它,但是不支持check。我该怎么做?

CREATE TABLE Fare (
    type_of_passenger varchar(20),
    price FLOAT,
    PRIMARY KEY (type_of_passenger),
    CHECK (lower(type_of_passenger)='child' OR lower(type_of_passenger)='student' OR lower(type_of_passenger)='senior')
);
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39721
 
1149 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Barmar
Reply   •   1 楼
Barmar    6 年前

看起来你真的想实现一个 ENUM :

type_of_passenger ENUM('child', 'student', 'senior')

默认情况下,mysql不验证枚举值,因此如果您尝试存储其他内容,它将存储一个空字符串,但如果启用了strict sql模式,它将报告一个错误。

另一种选择是将其作为输入有效值的表的外键。

CREATE TABLE passenger_types (
    type VARCHAR(20) NOT NULL PRIMARY KEY
);
INSERT INTO passenger_types (type) VALUES
('child'), ('student'), ('senior');


CREATE TABLE Fare (
    type_of_passenger varchar(20),
    price FLOAT,
    PRIMARY KEY (type_of_passenger),
    CONSTRAINT FOREIGN KEY (type_of_passenger) REFERENCES passenger_types (type)
);
Arth
Reply   •   2 楼
Arth    6 年前

你确定你需要那张支票吗?因为主键是 type_of_passenger 你只能坐三排。这看起来像是杀戮过度

你可以 INSERT 那三排继续前进。如果在外键中引用此字段,则无论如何都将限制为表中的值

事实上,只要使用在update restrict和delete restrict中使用的外键引用每个值,就无法更改它们

我在这里看到的唯一有效问题是,您希望允许db用户更改 price 但不是 旅客类型

如果你 插入 正确的(或存根)数据开始时,您可以通过 permissions

N.B. 我将在这里使用一个代理无符号整数primary,并使字符串描述唯一,因此,如果我确实需要更改字符串,我可以不用担心,也不用担心更新引用它的所有表会对性能造成影响。