html tool

显示标签为“mysql”的博文。显示所有博文
显示标签为“mysql”的博文。显示所有博文

2019年10月17日星期四

转:MySQL四种存储引擎(InnoDB、MyISAM、MEMORY、Archive)介绍和对比


http://www.05bk.com/300.html

1.InnoDB - b+

InnoDB官方特点描述是“支持事务,行级锁定和外键”。是事务型数据库的首选引擎,支持事务安全表 (ACID),支持行锁定和外键。MySQL5.5.5 之后,InnoDB作为默认存储引擎。如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择。

2.MyISAM - b+

MyISAM基于ISAM的存储引擎,并对其进行扩展。它是在Web、数据存储和其他应用环境下最常用的存储引擎之一。拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5之前的版本中,MyISAM 是默认存储引擎。如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率

3.MEMORY -b+/hash

MEMORY官方特点描述是“基于散列,存储在内存中,对临时表有用”。该存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。不支持事务和外键。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。

4.Archive - b+

Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive。如果只有INSERT和SELECT操作,可以选择Archive。

5.查看MySQL支持的引擎和默认引擎

  1. SHOW ENGINES;
  2. #输出结果中Support列的值是YES代表目前mysql支持该类引擎,如果是DEFAULT代表是默认引擎。

6.查看MySQL某个表使用的引擎

  1. SHOW CREATE TABLE 表名;

7.四种存储引擎对比

功 能MYISAMMemoryInnoDBArchive
存储限制256TBRAM64TBNone
支持事物xxx
支持全文索引xxx
支持数索引x
支持哈希索引xxx
支持数据缓存xN/Ax
支持外键xxx

2019年9月17日星期二

解决Navicat for MySQL 连接 Mysql 8.0.11 出现1251- Client does not support authentication protocol 错误

问题:

解决Navicat for MySQL 连接 Mysql 8.0.11 出现1251- Client does not support authentication protocol 错误

解决:

解决问题方法有两种:
方法1.升级navicat驱动;
[pope测试通过]方法2.把mysql用户登录密码加密规则还原成mysql_native_password.
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则 (这行我没有写,不过貌似也可以)

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新一下用户的密码
FLUSH PRIVILEGES; #刷新权限
[popexizhi:
关于identified with ?官方如下,这个是oracle的用法吗?
https://dev.mysql.com/doc/refman/8.0/en/alter-user.html
Example: Specify the authentication plugin, along with a cleartext password value:

ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password
             BY 'password';

]


参考:
https://blog.csdn.net/seventopalsy/article/details/80195246
https://blog.csdn.net/tiankongcheng6/article/details/80858520

2019年9月16日星期一

设置mysql启动时的环境变量 8.0.5

设置mysql启动时的环境变量
--修改密码时用了这个,
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
再次重启前使用这个,或者 systemctl set-environment MYSQLD_OPTS=""
systemctl unset-environment MYSQLD_OPTS="--skip-grant-tables"

2019年9月11日星期三

mysql 8.0 默认密码的修改

问题:

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

处理:

方法1. [https://dev.mysql.com/doc/refman/5.6/en/alter-user.html]
mysql> SET PASSWORD = PASSWORD('123456');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PASSWORD('123456')' at line 1

mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

方法2: [popexizhi: 版本问题是个大大的坑,以后看帮助一定要注意版本啊,pope安装的8.0 用5.6的方法是处理不了的啊,的啊,的啊 :)]

[https://dev.mysql.com/doc/refman/8.0/en/password-management.html]
mysql> SET PERSIST default_password_lifetime = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER USER USER() IDENTIFIED BY '123$%^qwe';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> alter user USER() IDENTIFIED BY '123$%^QWErty';
Query OK, 0 rows affected (0.06 sec)


2019年9月3日星期二


问题:

mysql err log -- mysqld.log  中提示如下:
mysqld: File './binlog.index' not found

解决:

https://blog.csdn.net/aidenliu/article/details/6586775

chgrp -R mysql /usr/local/mysql/data && chown -R mysql /usr/local/mysql/data 
重新启动mysql  [OK]

[popexizhi analysis]

这里解决到不是最重要的,是步骤,这个问题困了pope一日多,最后发现是在配置文件中找到err log查看这个log ,google后处理的。

这里的问题:
1. systemctl status 中的log和 journalctl -xe 是提示到os的最后一层很多细节都没有了,之后定位问题要求,要代码本身的err ,debug log才是ok的
2. 查找问题看log的顺序是否可以有结构化的指导呢?可以仔细想想[next-thinking]

2019年9月1日星期日

mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'databases' AND TABLE_NAME = 'xxxx';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109) /*!40000 ALTER TABLE `xxxx` ENABLE KEYS */; UNLOCK TABLES;



错误提示:

mysqldump: Couldn't execute 'SELECT COLUMN_NAME,                       JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')                FROM information_schema.COLUMN_STATISTICS                WHERE SCHEMA_NAME = 'databases' AND TABLE_NAME = 'xxxx';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
/*!40000 ALTER TABLE `xxxx` ENABLE KEYS */;
UNLOCK TABLES;

环境:
client:
mysqldump  Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL)

server:
Server version: 5.5.5-10.2.10-MariaDB-log MariaDB Server

解答:

This is due to a new flag that is enabled by default in mysqldump 8. 
You can disable it by adding --column-statistics=0. The command will be something like:
mysqldump --column-statistics=0 --host=<server> --user=<user> --password=<password> 
[popexizhi:
这是因为新版的mysqldump默认启用了一个新标志,通过--column-statistics=0来禁用他。官方文档的解释
Add ANALYZE TABLE statements to the output to generate histogram statistics for dumped tables when the dump file is reloaded. This option is disabled by default because histogram generation for large tables can take a long time.
]
Check this link for more information. To disable column statistics by default, you can add
[mysqldump]
column-statistics=0
to a MySQL config file, such as /etc/my.cnf or ~/.my.cnf.

2017年11月21日星期二

mysql 完全卸载

https://askubuntu.com/questions/643251/having-trouble-installing-and-removing-mysql-in-ubuntu

sudo apt-get remove --purge mysql-\*
[popexizhi:
sudo apt-get remove mysql-\* 无法删除mysql的配置和数据库文件
重新安装会提示如下:
dpkg: error processing package mysql-common (--configure):
 subprocess installed post-installation script returned error exit status 2
Errors were encountered while processing:
 mysql-common
]

2017年9月18日星期一

mysql索引类型normal,unique,full text的区别是什么


参考:http://www.cnblogs.com/cq-home/p/3482101.html

问题1:mysql索引类型normal,unique,full text的区别是什么?
normal:表示普通索引
unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。

mysql 索引分类 
在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令 MySQL的查询和运行更加高效。索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。 
1、普通型索引 这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建: 
(1)创建索引,例如CREATE INDEX 索引的名字 ON tablename (列名1,列名2,...); 
(2)修改表,例如ALTER TABLE tablename ADD INDEX 索引的名字 (列名1,列名2,...); 
(3)创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX 索引的名字 (列名1,列名 
2,...) ); 
2、唯一索引 这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建: 
(1)创建索引,例如CREATE UNIQUE INDEX 索引的名字 ON tablename (列的列表); 
(2)修改表,例如ALTER TABLE tablename ADD UNIQUE 索引的名字 (列的列表); 
(3)创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE 索引的名字 (列的列 
表) ); 
3、主键 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。 (主键相当于聚合索引,是查找最快的索引) 
4、单列索引和多列索引 索引可以是单列索引,也可以是多列索引。 
(1)单列索引就是常用的一个列字段的索引,常见的索引。 
(2)多列索引就是含有多个列字段的索引 
alter table student add index sy(name,age,score); 
索引sy就为多列索引,多列索引在以下几中情况下才能有效: 
select * from student where name='jia' and age>='12' //where条件中含有索引的首列字段和 
第二个字段 
select * from student where name='jia' //where条件中只含有首列字段 
select * from student where name='jia' and score<60 nbsp="" span="" where="">
段 
总结:多列索引只有在where条件中含有索引中的首列字段时才有效 
5、选择索引列 应该怎样选择索引列,首先要看查询条件,一般将查询条件中的列作为索引

左右连接,全连接,内连接和交叉连接的区别

参考:
http://www.cnblogs.com/zxlovenet/p/4005256.html
http://dataunion.org/11954.html

下面这个图说的还是很清楚的,保留一个



例子如下:
数据库数据:
           
book表                                          stu表

1.内连接
1.1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
1.2.不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
1.3.自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
内连接:内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
select * from book as a,stu as b where a.sutid = b.stuid

select * from book as a inner join stu as b on a.sutid = b.stuid
内连接可以使用上面两种方式,其中第二种方式的inner可以省略。
其连接结果如上图,是按照a.stuid = b.stuid进行连接。

2.外连接
2.1.左联接:是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL
select * from book as a left join stu as b on a.sutid = b.stuid
2.2.右连接:是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL
select * from book as a right join stu as b on a.sutid = b.stuid
2.3.全连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
select * from book as a full outer join stu as b on a.sutid = b.stuid

3.交叉连接
交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
select * from book as a cross join stu as b order by a.id

2017年8月21日星期一

regexp rlike not rlike

add:http://www.cnblogs.com/xyxxs/p/4748708.html

问题 : sql如何使用正则取反

回答:
不使用正则
 select * from a where id not like '_a%';

使用正则单字符
select * from a where id regexp '[0-9][^a]\..*';

使用正则字符串
??

2017年3月20日星期一

mysql远程连接

【popexizhi】
根据后文每次修改都不生效,好郁闷
后来发现是mysql监听ip默认为127.0.0.1 要求修改为当前ip的

位置默认为/etc/mysql/my.cfg
45 # Instead of skip-networking the default is now to listen only on
46 # localhost which is more compatible and is not less secure.
47 bind-address            = 127.0.0.1 #改为主机ip

重启mysql 服务
 sudo /etc/init.d/mysql restart



add: http://www.2cto.com/database/201205/130093.html
MySQL远程访问权限,允许远程连接的开启
 
1、登陆mysql数据库    
   mysql -u root -p
   查看user表  www.2cto.com  
mysql> use mysql;
Database changed
mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host         | user | password                                  |
+--------------+------+-------------------------------------------+
| localhost    | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
2 rows in set (0.00 sec)
 
   可以看到在user表中已创建的root用户。host字段表示登录的主机,其值可以用IP,也可用主机名,
   (1)有时想用本地IP登录,那么可以将以上的Host值改为自己的Ip即可。
 
2、实现远程连接(授权法)
   将host字段的值改为%就表示在任何客户端机器上能以root用户登录到mysql服务器,建议在开发时设为%。   
   update user set host = ’%’ where user = ’root’;
   将权限改为ALL PRIVILEGES
mysql> use mysql;
Database changed
mysql> grant all privileges  on *.* to root@'%' identified by "root";
Query OK, 0 rows affected (0.00 sec)  www.2cto.com  
mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host         | user | password                                  |
+--------------+------+-------------------------------------------+
| localhost    | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| %            | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
3 rows in set (0.00 sec)
这样机器就可以以用户名root密码root远程访问该机器上的MySql.
3、实现远程连接(改表法)
use mysql;
update user set host = '%' where user = 'root';
这样在远端就可以通过root用户访问Mysql.

2017年2月26日星期日

mysql db diff


add: https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldbcompare.html

测试 shell> mysqldbcompare --server1=root@localhost emp1:emp2 --run-all-tests
--------------------------------------------------
mysqldbcompare --server1=root:password@127.0.0.1 --server2=root:password@127.0.0.1 --difftype=sql npl2:Server50505 --run-all-tests
# server1 on 127.0.0.1: ... connected.
# server2 on 127.0.0.1: ... connected.
# Checking databases npl2 on server1 and Server50505 on server2
#

# WARNING: Cannot generate SQL statements for these objects.
# Check the difference output for other discrepencies.
--- `npl2`
+++ `Server50505`
@@ -1 +1 @@
-CREATE DATABASE `npl2` /*!40100 DEFAULT CHARACTER SET latin1 */
+CREATE DATABASE `nplServer50505` /*!40100 DEFAULT CHARACTER SET latin1 */
# WARNING: Could not generate changes for {0}. No changes required or not supported difference.

# WARNING: Cannot generate SQL statements for these objects.
# Check the difference output for other discrepencies.
--- `npl2`
+++ `nplServer50505`
@@ -1 +1 @@
-CREATE DATABASE `npl2` /*!40100 DEFAULT CHARACTER SET latin1 */
+CREATE DATABASE `nplServer50505` /*!40100 DEFAULT CHARACTER SET latin1 */

#                                                   Defn    Row     Data  
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# TABLE     host_config                             pass    pass    pass  
# TABLE     host_conn                               pass    pass    pass  
# TABLE     host_conn_key                           pass    pass    pass  
# TABLE     host_vid                                pass    pass    pass  
# TABLE     next_hop                                pass    pass    pass  
# TABLE     property                                pass    pass    pass  

# Databases are consistent.
#
# ...done

2017年2月21日星期二

mysql Buffer pool hit rate


http://wubx.net/mysql_innodb_buffer_pool_hit/

show engine innodb status\G;
Buffer pool hit rate : XXXX/1000;
那个XXX/1000即是buffer pool hit ratios的命中.
这样也可以从代码里看一下这个bp命中计算:

mysql 慢查询设置


参考:http://www.cnblogs.com/kerrycode/p/5593204.html
慢查询日志相关参数
MySQL 慢查询的相关参数解释:
slow_query_log    :是否开启慢查询日志,1表示开启,0表示关闭。
log-slow-queries  :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。
log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。
log_output:日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。


慢查询日志配置
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启,如下所示:
mysql> show variables  like '%slow_query_log%';
+---------------------+-----------------------------------------------+
| Variable_name       | Value                                         |
+---------------------+-----------------------------------------------+
| slow_query_log      | OFF                                           |
| slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
+---------------------+-----------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.09 sec)
 
mysql> show variables like '%slow_query_log%';
+---------------------+-----------------------------------------------+
| Variable_name       | Value                                         |
+---------------------+-----------------------------------------------+
| slow_query_log      | ON                                            |
| slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
+---------------------+-----------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> 

2016年8月11日星期四

mysql "Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause"



EAP db init 时有存在表添加失败问题,提示如下:
[Err] 1293 -  

[由于mysql版本问题引起参见 http://stackoverflow.com/questions/4489548/why-there-can-be-only-one-timestamp-column-with-current-timestamp-in-default-cla]
添加说明文件EAP db版本要求mysql 5.6 以上,升级44 db

2015年6月18日星期四

mysql锁表测试--模拟网络问题

add:http://www.cnblogs.com/fuyunbiyi/archive/2012/04/02/2430304.html
问题:模拟代码级别的事务回滚
使用对修改表数据库加锁完成,手动加锁数据库
lock table xxx要求 read (write);/*xxx 为表名称*/

-- lock table jsorder.historyrefund write;
-- unlock tables;

2015年6月5日星期五

mysql group by的使用


参考:http://www.enet.com.cn/article/2006/1123/A20061123303665.shtml
在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM bbc
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有
国家的总人口数。
通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值.
也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.
HAVING子句可以让我们筛选成组后的各组数据.WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.
而 HAVING子句在聚合后对组记录进行筛选。
让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。
SQL实例:
一、显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中
的不同字段(一或多条记录)作运算。
---------------------------------------------
[popexizhi] group by 后每组都可以使用聚合函数max().count(),avg()等等,这样就虽然只有一行显示,但是这个行可以用来显示这些统计结果,这个group by是为统计处理而生的吗?!:)
参考:http://www.cnblogs.com/jinzhenshui/archive/2009/12/22/1629950.html 看来我的猜测没有错,"group by的rollup统计修饰词" ok,原来mysql中的group by真的是分组后做统计处理的。
---------------------------------------------------
二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,HAVING子句可以让我们筛选成组后的各组数据
[popexizhi] 这里的having可以和select sum(area)>1000000相同处理了,嘻嘻,ok
PS:可以补充上面为
select * from
(SELECT region, SUM(population), SUM(area) as t FROM bbc GROUP BY region ) as b
HAVING SUM(area)>1000000 ;

2014年8月31日星期日

python for mysql connect

1.linux using _mysql(add:http://zetcode.com/db/mysqlpython/)
2.windows using _mysql
( http://mysql-python.blogspot.com/2012/11/is-mysqldb-hard-to-install.html)
问题:"error: Unable to find vcvarsall.bat"
解决:http://stackoverflow.com/questions/2272786/python-issueunable-to-find-vcvarsall-bat
【You will need MSVC compiler or mingw32 to compile that, and also need MySQL Header files.

I've compiled once for MySQL1.2.3c1 for Python2.6, you could find it here.】
setup了:MySQL-python-1.2.3c1.win32-py2.6.exe

2014年7月2日星期三

mysql的check约束不起作用

在mysql中测试如下
My SQL:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
但添加id_P为0时可以成功的,why?
[go]了一下http://stackoverflow.com/questions/14247655/mysql-check-constraint 中解释mysql应该是不支持,其中如下:
CHECK constraints are ignored by MySQL as explained in a miniscule comment in the docs: CREATE TABLE
The CHECK clause is parsed but ignored by all storage engines.
这里引用http://dev.mysql.com/doc/refman/5.5/en/create-table.html 中的






For other storage engines, MySQL Server parses and ignores the FOREIGN KEY and REFERENCES syntax inCREATE TABLE statements. The CHECK clause is parsed but ignored by all storage engines