尝试CREATE ASSERTION时出现无法解释的mysql错误

时间:2016-01-13 14:32:07

标签: mysql mariadb

我目前正在学习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
--------------

2 个答案:

答案 0 :(得分:2)

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

  

本页是Peter Gulutzan&amp; Sons出版的SQL-99 Complete的书的一部分。 Trudy Pelzer。作者慷慨地允许我们在这里重现这本书的内容。由于本书是关于SQL-99标准的,因此本书中此页面和其他页面的内容可能不会直接应用于MariaDB。使用导航栏导航书籍。

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

关于各种CREATE语句的文章

  • CREATE DATABASE创建数据库
  • 创建活动 创建并安排新活动 1
  • 创造功能 创建存储函数
  • 创建功能UDF 创建用户定义的功能
  • 创建指数 在一列或多列上创建索引
  • 创建程序 创建存储过程
  • 创造角色 添加新角色
  • 创建服务器 定义服务器 5
  • 创建表 创建新表
  • 创建表格 MariaDB
  • 中没有CREATE TABLESPACE
  • 创建触发器 创建新触发器
  • 创建用户 创建新的MariaDB帐户
  • 创建视图 创建或替换视图

答案 1 :(得分:-1)

我建议您使用检查约束而不是这个,但这不适用于mysql。正如我在想的那样,我有一个想法是创建一个无符号整数作为此列的类型,以避免负值。