我目前正在学习mysql,我的实现是Arch Linux上的MariaDB,我在下面发布STATUS
以防万一。
所以这就是问题,我有这个表:
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
我没有看到与MariaDB文档on this webpage上的示例有所不同。检查中的SELECT
语句可以自行处理,因此问题必须在其他地方,但我没有看到。
无论如何,这是完整的服务器信息:
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
--------------
答案 0 :(得分:2)
我想引用您链接的页面顶部的内容:
本页是Peter Gulutzan&amp; Sons出版的SQL-99 Complete的书的一部分。 Trudy Pelzer。作者慷慨地允许我们在这里重现这本书的内容。由于本书是关于SQL-99标准的,因此本书中此页面和其他页面的内容可能不会直接应用于MariaDB。使用导航栏导航书籍。
MariaDB特定文档是不同的。您可以在mariadb的网站上找到支持的CREATE statements的完整列表。此列表不包括CREATE ASSERTION,因此MariaDB不支持此功能,因此出现错误消息:
关于各种CREATE语句的文章
答案 1 :(得分:-1)
我建议您使用检查约束而不是这个,但这不适用于mysql。正如我在想的那样,我有一个想法是创建一个无符号整数作为此列的类型,以避免负值。