尝试创建断言时出现无法解释的mysql错误

尝试创建断言时出现无法解释的mysql错误,mysql,mariadb,Mysql,Mariadb,我目前正在学习mysql,我的实现是Arch Linux上的MariaDB,我在下面发布了状态,以防相关 问题是,我有一张表: MariaDB [biodb_sam]> SELECT * FROM pwms LIMIT 10; +---------+-----+------+-------+ | tfs_id | pos | base | value | +---------+-----+------+-------+ | hPDI060 | 1 | A | 0.01 | |

我目前正在学习mysql,我的实现是Arch Linux上的MariaDB,我在下面发布了
状态
,以防相关

问题是,我有一张表:

MariaDB [biodb_sam]> SELECT * FROM pwms LIMIT 10;
+---------+-----+------+-------+
| tfs_id  | pos | base | value |
+---------+-----+------+-------+
| hPDI060 |   1 | A    |  0.01 |
| hPDI060 |   1 | C    |  0.01 |
| hPDI060 |   1 | G    |  0.97 |
| hPDI060 |   1 | T    |  0.01 |
| hPDI060 |   2 | A    |  0.01 |
| hPDI060 |   2 | C    |  0.48 |
| hPDI060 |   2 | G    |   0.5 |
| hPDI060 |   2 | T    |  0.01 |
| hPDI060 |   3 | A    | 0.625 |
| hPDI060 |   3 | C    |  0.01 |
+---------+-----+------+-------+
10 rows in set (0.00 sec)
但是,当我想添加一个简单的断言时,为了确保
pos
始终为正,我得到以下错误:

MariaDB [biodb_sam]> CREATE ASSERTION foo CHECK(NOT EXISTS (SELECT * FROM pwms WHERE pos < 1));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ASSERTION foo CHECK(NOT EXISTS (SELECT * FROM pwms WHERE pos < 1))' at line 1

我想引用您链接的页面顶部的内容:

本页是Peter Gulutzan&Trudy Pelzer出版的《SQL-99完全》一书的一部分。作者们慷慨地允许我们在这里复制这本书的内容。因为本书是关于SQL-99标准的,所以本书和本书中其他页面的内容可能不会直接适用于MariaDB。使用导航栏导航书本

MariaDB特定的文档是不同的。您可以在mariadb的网站上找到支持的完整列表。此列表不包括创建断言,因此MariaDB不支持此功能,因此出现错误消息:

关于各种CREATE语句的文章

  • 创建数据库创建数据库
  • 创建事件 创建并安排新事件 一,
  • 创建函数 创建一个存储函数
  • 创建函数自定义项 创建用户定义的函数
  • 创建索引 在一个或多个列上创建索引
  • 创建过程 创建存储过程
  • 创建角色 添加新角色
  • 创建服务器 定义服务器 五,
  • 创建表 创建新表
  • 创建表空间 创建表空间在MariaDB中不可用
  • 创建触发器 创建一个新触发器
  • 创建用户 创建新帐户
  • 创建视图 创建或替换视图

我建议您使用check约束而不是这个约束,但这在mysql中不起作用。正如我所想,我有一个想法,就是为这个列创建一个无符号整数作为类型,以避免出现负值。

谢谢,我确实有点太快了,没有跳过它。在MariaDB中使用此功能的最佳替代方案是什么?通常不支持此功能。时期但是,在这种特殊情况下,可以将pos字段声明为无符号整数类型,然后不能为其分配负值。即使mariadb支持check约束,我也会使用无符号整数类型来实现所需的结果。从性能的角度来看,它要有效得多。mysql和mariadb都不支持检查约束。如果CREATETABLE语句中存在check约束,那么mysql将对其进行解析(因此不会生成语法错误),但会自动忽略。我猜,mariadb也做了同样的事情。是的,这对我来说是很好的信息,谢谢,我会编辑我的答案。
MariaDB [biodb_sam]> STATUS;
--------------
mysql  Ver 15.1 Distrib 10.1.10-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:          52
Current database:       biodb_sam
Current user:           sam@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         10.1.10-MariaDB-log MariaDB Server
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /run/mysqld/mysqld.sock
Uptime:                 1 day 16 hours 56 min 2 sec

Threads: 4  Questions: 6264  Slow queries: 0  Opens: 142  Flush tables: 1  Open tables: 64  Queries per second avg: 0.0
42
--------------