1. Mysql 培訓 1.1. 培訓目的 本文檔是針對MySQL 數據庫方面的基礎培訓,爲了使項目組成員可以達到使用MySQL 數據庫的目的。 1.2. 培訓對象 開發者 1.3. 常用詞及符號說明 常用詞: Mysql:一種免費的跨平臺的數據庫系統 E:/mysql:表示是在dos 命令窗體下面 mysql> 表示是在mysql 的命令行下 1.4. 參考信息 http://dev.mysql.com/doc/refman/5.0/en/index.html 2. MYSQL 2.1. 鏈接MYSQL 格式: mysql -h主機地址 -uusername -p用戶password 鏈接遠程機器: E:/mysql>mysql -h10.4.3.188 -uptsdb -p 等價寫法 E:/mysql>mysql --host=10.4.3.188 --user=ptsdb --password 鏈接本地機器: E:/mysql>mysql -uroot -p 等價寫法 E:/mysql>mysql --user=root -password (注:u與root可以不用加空格,其它也同樣) 注意事項:環境變量path 裏面要設定mysql的bin的路徑: C:/Program Files/MySQL/MySQL Server 5.0/bin 2.2. 改動password 方法一:使用mysqladmin 格式:mysqladmin -uusername -p舊password password 新password 例1:E:/mysql>mysqladmin -uroot password root 注:因爲開始時root沒有password,因此-p舊password一項就可以省略了。 例2:再將root的password改成root123。 E:/mysql>mysqladmin -uroot -proot password root123 方法二:直接更新 user 表 mysql>UPDATE user SET password=PASSWORD("test123") WHERE user='test'; mysql> FLUSH PRIVILEGES; mysql> SET PASSWORD FOR test=PASSWORD('test123'); mysql> FLUSH PRIVILEGES; 方法三:使用 grant 格式:grant 權限 on 數據庫.表格| 其它 to 用戶@主機 IDENTIFIED BY 口令 例1:給test用戶在本地localhost 所有權限(除了GRANT OPTION),口令爲 test (至關於改動了test 用戶的口令) mysql>grant all on *.* to test@localhost identified by "test"; 等同於 mysql>grant all on *.* to test @localhost identified by PASSWORD " *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 "; 例二、添加�一個用戶testpassword爲abc,讓他可以在不論什麼主機上登陸,並對test數據庫有查詢、插入、改動、刪除的權限。首先用以root用戶連入MYSQL,而後鍵入下面命令: mysql>grant select,insert,update,delete on test.* to test@"%" Identified by "abc"; 在mysql.user 表中,有兩個test 用戶 一個test 用戶,在本地有所有的權限 另外的test 用戶,在所有主機上有增刪改查權限 一樣可以取消部分權限(所有) mysql>revoke insert,update,delete on test.* from test@"%" mysql>REVOKE ALL PRIVILEGES, GRANT OPTION FROM test@"%" 而後 mysql> FLUSH PRIVILEGES; Test 用戶再也不使用用了,也可以刪除 mysql>Delete from user where user='test' and host='%' mysql> FLUSH PRIVILEGES; 注意:例2添加�的用戶是比較危急的,你想如某我的知道test的password,那麼他就可以在internet上的不論什麼一臺電腦上登陸你的mysql數據庫並對你的數據庫test隨心所欲了(可以經過限定主機) mysql>grant select,insert,update,delete on test.* to test@"IP地址" Identified by "abc"; 2.3. 顯示命令 顯示數據庫列表: mysql>show databases; mysql>show schemas; --mysql 5.0.2 顯示錶格 mysql>show tables from mydb; 顯示錶格狀態 Mysql>SHOW TABLE STATUS; 顯示字符集: mysql> SHOW CHARACTER SET; 顯示建立表: mysql> show create table quote; 顯示用戶權限: mysql> SHOW GRANTS FOR 'test'@'localhost'; mysql>SHOW GRANTS; mysql>SHOW GRANTS FOR CURRENT_USER; mysql>SHOW GRANTS FOR CURRENT_USER(); 顯示index: mysql>SHOW INDEX FROM mydb.mytable; 顯示錶結構: mysql>desc mydb.tablename; mysql>show columns from mydb.tablename; 顯示MySQL數據庫的版本號: mysql>select version(); 顯示函數 mysql>Select * from mysql.func; 顯示存儲過程 mysql>Select * from mysql.proc; 顯示存儲引擎 mysql> SHOW ENGINES; 顯示變量: mysql>SHOW VARIABLES; 顯示狀態: Mysql> SHOW STATUS; 顯示進程 Mysql>SHOW PROCESSLIST 顯示 INNODB 狀態 Mysql>SHOW INNODB STATUS 顯示鏈接狀態 Mysql>SHOW STATUS LIKE '%CONNECT%'; 顯示線程狀態 Mysql>SHOW STATUS LIKE '%THREAD%'; 等等.. 2.4. 建立.改動.刪除 2.4.1. 建立數據庫 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name 好比: CREATE DATABASE IF NOT EXISTS ddd --假設不存在,則建立. CHARACTER SET 'ujis' --設定字符集 COLLATE 'ujis_japanese_ci'; 2.4.2. 建立表 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] 樣例: CREATE TABLE if not exists `Admin_User` ( `id` int(11) NOT NULL auto_increment, --PRIMARY KEY, `livedoorId` varchar(255) NOT NULL default '', `password` varchar(255) NOT NULL default '', `auth` int(11) default '0', PRIMARY KEY (`id`) --設定主健 ) ENGINE=MyISAM DEFAULT CHARSET=ujis ?設定字符集 ENGINE=MyISAM 默認存儲引擎 The binary portable storage engine that is the default storage engine used by MySQL 對於每個MyISAM 存儲引擎的表,在硬盤上存在3個文件 File Purpose tbl_name.frm Table format (definition) file tbl_name.MYD Data file tbl_name.MYI Index file ENGINE= InnoDB Transaction-safe tables with row locking and foreign keys. ENGINE = BDB Transaction-safe tables with page locking. 還有其它的內存引擎 MEMORY 歸檔 ARCHIVE 等等 ISAM 再也不使用了 2.4.3. 建立索引 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name (index_col_name,...) index_col_name: col_name [(length)] [ASC | DESC] 將customer 表的name 字段前十個字符作爲索引 CREATE INDEX part_of_name ON customer (name(10)); MYSQL 5.0 特性 存儲引擎爲 MyISAM, InnoDB, or BDB 的表格上,可以在有null值的字段上建立索引 存儲引擎爲 MyISAM, InnoDB, or BDB 的表格上,可以在BLOB TEXT 上建立索引 僅僅有在MyISAM 類型表格上,可以在CHAR, VARCHAR, and TEXT 字段類型上建立FULLTEXT 索引 Storage Engine Allowable Index Types MyISAM BTREE InnoDB BTREE MEMORY/HEAP HASH, BTREE 可以指定索引類型 Example: CREATE TABLE testtable (id INT) ENGINE = MEMORY; CREATE INDEX id_index USING BTREE ON testtable (id); 2.4.4. 改動表 ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification] ... IGNORE 忽略主健反覆的錯誤,假設反覆,採用第一條,其他刪除 樣例:同一時候多個操做 mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d; 樣例, 重命名 INTEGER 字段,從 a 到 b: mysql> ALTER TABLE t1 CHANGE a b INTEGER; 樣例 改動字段類型,仍然需要新舊字段名稱,即便字段名稱一樣: mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL; 也可以使用modify mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL; 在mysql 5.0 可以使用FIRST or AFTER 字段來加入�add 字段,默認是在最後 modify change 也可以使用 在mysql 5.0 InnoDB 存儲引擎支持 ALTER TABLE 刪除外健: mysql>ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol; 樣例: 建立表 mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10)); 重命名錶 mysql> ALTER TABLE t1 RENAME t2; MODIFY a 字段爲 TINYINT NOT NULL , 並且 change 字段 b,從 CHAR(10) 到 CHAR(20) 並更名爲c: mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20); 加入�新字段 d: mysql> ALTER TABLE t2 ADD d TIMESTAMP; 在a d 上添加�索引: mysql> ALTER TABLE t2 ADD INDEX (d), ADD INDEX (a); 刪除字段c: mysql> ALTER TABLE t2 DROP COLUMN c; 加入�一個本身主動增加的字段c ,並且加入�c 爲主健: mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, -> ADD PRIMARY KEY (c); 2.4.4.1. 改動外鍵 語法: ALTER TABLE tbl_name ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] 樣例: create table aa (id1 int not null,name varchar(20),primary key(id1))type=InnoDB; create table b(id2 int not null,lessonname varchar(20),primary key(id2))type=InnoDB; alter table b add FOREIGN KEY id (id2) references aa(id1); 2.4.5. 刪除 刪除數據庫 DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 樣例: mysql>drop DATABASE IF EXISTS testdb; 刪除表 DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] 樣例: mysql>drop TABLE IF EXISTS testTable; 刪除索引 DROP INDEX index_name ON tbl_name 樣例: mysql>drop index testIndex on testTable; 重命名 RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ... 樣例:RENAME TABLE current_db.tbl_name TO other_db.tbl_name; 2.5. 數據庫備份恢復 數據庫備份 數據庫備份命令: mysqldump --opt --user=username --password=password --default_character-set=字符集 -B數據庫> 輸出的sql文件 樣例: E:/mysql>Mysqldump --user=ptsdb --password=ptsdb --default_character-set=ujis --opt pts>dump.sql 參見批處理文件 數據庫導入命令: mysql --user=username --password=password --default_character-set=字符集 [數據庫]<導入的sql 語句 E:/mysql>mysql -uptsdb -pptsdb --default-character-set=ujis 樣例: 對於InnoDB(沒有設定字符集) Following mysqldump import example for InnoDB tables is at least 100x faster than previous examples. 1. mysqldump --opt --user=username --password database > dumbfile.sql 2. Edit the dump file and put these lines at the beginning: SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS=0; 3. Put these lines at the end: SET FOREIGN_KEY_CHECKS = 1; COMMIT; SET AUTOCOMMIT = 1; 4. mysql --user=username --password database < dumpfile.sql 參數說明: --add-drop-database Add a DROP DATABASE statement before each CREATE DATABASE statement. --add-drop-table Add a DROP TABLE statement before each CREATE TABLE statement. --all-databases, -A Dump all tables in all databases. This is the same as using the --databases option and naming all the databases on the command line. --databases, -B Dump several databases. Normally, mysqldump treats the first name argument on the command line as a database name and following names as table names. With this option, it treats all name arguments as database names. CREATE DATABASE IF NOT EXISTS db_name and USE db_name statements are included in the output before each new database. --host=host_name, -h host_name Dump data from the MySQL server on the given host. The default host is localhost. --opt This option is shorthand; it is the same as specifying --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset. It should give you a fast dump operation and produce a dump file that can be reloaded into a MySQL server quickly. In MySQL 5.0, --opt is on by default, but can be disabled with --skip-opt. To disable only certain of the options enabled by --opt, use their --skip forms; for example, --skip-add-drop-table or --skip-quick. 另外一些其它參數,有興趣可以學習 2.6. 表數據備份 mysql>use test; mysql> CREATE TABLE imptest(id INT, n VARCHAR(30)); Query OK, 0 rows affected (0.03 sec) 方法一: 導出使用:Mysqldump E:/mysql>mysqldump -uptsdb -pptsdb -where "id>='100'" test imptest E:/mysql>mysqldump -uptsdb -pptsdb test imptest>e:/mysql/imp/imptest2.txt 導入使用 mysql mysql -uptsdb -pptsdb< imptest2.txt 方法二: 導出使用 select into OUTFILE mysql> select * from imptest where id=101 into OUTFILE 'e://mysql//imp//test3.txt' FIELDS TERMINATED BY ','; 導入使用 LOAD DATA INFILE LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char' ] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number LINES] [(col_name_or_user_var,...)] [SET col_name = expr,...]] 樣例: mysql> LOAD DATA INFILE 'e://mysql//imp//test3.txt' INTO TABLE imptest FIELDS TERMINATED BY ','; 導入使用mysqlimport: E:/mysql>mysqlimport -uptsdb -pptsdb --local test E:/mysql/imp/imp.txt mysqlimport: Error: Table 'test.imp' doesn't exist, when using table: imp E:/mysql>mysqlimport -uptsdb -pptsdb --local test E:/mysql/imp/imptest.txt test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 注意:文件名稱必須跟表名一樣 參數 -d or --delete 新數據導入數據表中以前刪除數據數據表中的所有信息 -f or --force 不管是否遇到錯誤,mysqlimport將強制繼續插入數據 -i or --ignore mysqlimport跳過或者忽略那些有一樣惟一 -r or -replace 這個選項與-i選項的做用相反;此選項將替代 表中有一樣惟一keyword的記錄 2.7. 數據管道導入導出 E:/mysql>mysql -h10.5.1.66 -uroot -proot --default-character-set=name frontdb_20060415(databasename) >e:/mysql/test.txt (輸出的sql 語句) 1:>;create databases newname(在新的server上創建空的數據庫) 2:#/usr/local/mysql/bin/mysqldump databasename >*.sql(在舊的server上導出數據庫) 3:#/usr/local/mysql/bin/mysql databasename < *.sql(在新的server上導入*.sql) 注意數據庫名要一一相應. 2.8. 各類字段的取值範圍 TINYINT 1 byte -128 - 127 TINYINT UNSIGNED 1 byte 0 ? 255 即0-(28-1) SMALLINT 2 bytes -32768 - 32767 即-215至(215-1) SMALLINT UNSIGNED 2 bytes 0 - 65535 即0至(216-1) MEDIUMINT 3 bytes -8388608 - 8388607 即?223至(223-1) MEDIUMINT UNSIGNED 3 bytes 0 - 16777215 即0至(224-1) INT 或 INTEGER 4 bytes -2147483648 - 2147483647 即?231至(231-1) INT UNSIGNED 或 INTEGER UNSIGNED 4 bytes 0 - 4294967295 即0至(232-1) BIGINT 8 bytes -9223372036854775808 - 9223372036854775807 即?263至(263-1) BIGINT UNSIGNED 8 bytes 0 - 18446744073709551615 即0至(264-1) FLOAT 4 bytes -3.402823466E+38 - -1.175494351E-38 0 1.175494351E-38 - 3.402823466E+38 DOUBLE 或 DOUBLE PRECISION 或 REAL 8 bytes -1.7976931348623157E+308 - -2.2250738585072014E-308 0 2.2250738585072014E-308 - 1.7976931348623157E+308 DECIMAL[(M,[D])] 或 NUMERIC(M,D) 不定 由M(整個數字的長度,包含小數點,小數點左邊的位數,小數點右邊的位數,但不包含負號)和 D(小數點右邊的位數)來決定,M缺省爲10,D缺省爲0 DATE 3 bytes 1000-01-01 - 9999-12-31 DATETIME 8 bytes 1000-01-01 00:00:00 - 9999-12-31 23:59:59 TIMESTAMP 4 bytes 1970-01-01 00:00:00 - 2037-12-31 23:59:59 TIME 3 bytes -838:59:59' to 838:59:59 YEAR[(2|4)] 1 byte 缺省爲4位格式,4位格式取值範圍爲1901 - 2155,0000,2位格式取值範圍爲70-69(1970-2069) CHAR(M) [BINARY] 或 NCHAR(M) [BINARY] M bytes M的範圍爲1 - 255,假設沒有BINARY項,則不分大寫和小寫,NCHAR表示使用缺省的字符集.在數據庫 中以空格補足,但在取出來時末尾的空格將被去掉. [NATIONAL] VARCHAR(M) [BINARY] Before 5.0.3 M的範圍爲0?255 L+1 bytes L<=M 5.0.3 以及之後 M 範圍爲 0-65535 L+1 bytes L<=M 0<=M<=256 L+2 bytes L<=M 256<=65535 在數據庫中末尾的空格將本身主動去掉. TINYBLOB 或 TINYTEXT L+1 bytes 255(2^8-1)個字符 BLOB 或 TEXT L+2 bytes 65535(2^16-1)個字符 MEDIUMBLOB 或 MEDIUMTEXT L+3 bytes 16777215 (2^24-1)個字符 LONGBLOB 或 LONGTEXT L+4 bytes 4294967295 (2^32-1)個字符 ENUM('value1','value2',...) 1 or 2 bytes 可以總共同擁有65535個不一樣的值 SET('value1','value2',...) 1/2/3/4/8 bytes 最多有64個成員 2.9. 查詢 2.9.1. limit LIMIT子句可以用來限制由SELECT語句返回過來的數據數量,它有一個或兩個參數,假設給出兩個參數, 第一個參數指定返回的第一行在所有數據中的位置,從0開始(注意不是1),第二個參數指定最多返回行 數。好比: select * from table LIMIT 5,10; #返回第6-15行數據 select * from table LIMIT 5; #返回前5行 select * from table LIMIT 0,5; #返回前5行 2.9.2. join 具體解釋 仍是先 Create table 吧 create table emp( id int not null primary key, name varchar(10) ); create table emp_dept( dept_id varchar(4) not null, emp_id int not null, emp_name varchar(10), primary key (dept_id,emp_id)); insert into emp() values (1,"Dennis-1"), (2,"Dennis-2"), (3,"Dennis-3"), (4,"Dennis-4"), (5,"Dennis-5"), (6,"Dennis-6"), (7,"Dennis-7"), (8,"Dennis-8"), (9,"Dennis-9"), (10,"Dennis-10"); insert into emp_dept() values ("R&D",1,"Dennis-1"), ("DEv",2,"Dennis-2"), ("R&D",3,"Dennis-3"), ("Test",4,"Dennis-4"), ("Test",5,"Dennis-5"); ("dddd",20,"eeee"); >> left join ------------- select a.id,a.name,b.dept_id from emp a left join emp_dept b on (a.id=b.emp_id); # 挑出左邊的 table emp 中的所有資料,即便 emp_dept 中沒有的資料也挑出來,沒有的就用 NULL 來顯示, # 也即顯示資料是以左邊的 table emp 中的資料爲基礎 mysql> select a.id,a.name,b.dept_id -> from emp a left join emp_dept b on (a.id=b.emp_id); +----+-----------+---------+ | id | name | dept_id | +----+-----------+---------+ | 1 | Dennis-1 | R&D | | 2 | Dennis-2 | DEv | | 3 | Dennis-3 | R&D | | 4 | Dennis-4 | Test | | 5 | Dennis-5 | Test | | 6 | Dennis-6 | NULL | | 7 | Dennis-7 | NULL | | 8 | Dennis-8 | NULL | | 9 | Dennis-9 | NULL | | 10 | Dennis-10 | NULL | +----+-----------+---------+ # 挑出 table emp 中有而 table emp_dept 中沒有的人員資料 select a.id,a.name,b.dept_id from emp a left join emp_dept b on (a.id=b.emp_id) where b.dept_id IS NULL; mysql> select a.id,a.name,b.dept_id -> from emp a left join emp_dept b on (a.id=b.emp_id) -> where b.dept_id IS NULL; +----+-----------+---------+ | id | name | dept_id | +----+-----------+---------+ | 6 | Dennis-6 | NULL | | 7 | Dennis-7 | NULL | | 8 | Dennis-8 | NULL | | 9 | Dennis-9 | NULL | | 10 | Dennis-10 | NULL | +----+-----------+---------+ # 把 table emp_dept 放在左邊的情形(固然以 emp_dept 中的數據爲基礎來顯示資料,emp 中比emp_dept 中多的資料也就不會顯示出來了): select a.id,a.name,b.dept_id from emp_dept b left join emp a on (a.id=b.emp_id); mysql> select a.id,a.name,b.dept_id -> from emp_dept b left join emp a on (a.id=b.emp_id); +------+----------+---------+ | id | name | dept_id | +------+----------+---------+ | NULL | NULL | dddd | | 2 | Dennis-2 | DEv | | 1 | Dennis-1 | R&D | | 3 | Dennis-3 | R&D | | 4 | Dennis-4 | Test | | 5 | Dennis-5 | Test | +------+----------+---------+ >> right join --------------- select a.id,a.name,b.dept_id from emp a right join emp_dept b on (a.id=b.emp_id); # 挑資料時以右邊 table emp_dept 中的資料爲基礎來顯示資料 mysql> select a.id,a.name,b.dept_id -> from emp a right join emp_dept b on (a.id=b.emp_id); +------+----------+---------+ | id | name | dept_id | +------+----------+---------+ | NULL | NULL | dddd | | 2 | Dennis-2 | DEv | | 1 | Dennis-1 | R&D | | 3 | Dennis-3 | R&D | | 4 | Dennis-4 | Test | | 5 | Dennis-5 | Test | +------+----------+---------+ 6 rows in set (0.00 sec) # 咱們再把 table 的位置交換一下,再用 right join 試試 select a.id,a.name,b.dept_id from emp_dept b right join emp a on (a.id=b.emp_id); mysql> select a.id,a.name,b.dept_id -> from emp_dept b right join emp a on (a.id=b.emp_id); +----+-----------+---------+ | id | name | dept_id | +----+-----------+---------+ | 1 | Dennis-1 | R&D | | 2 | Dennis-2 | DEv | | 3 | Dennis-3 | R&D | | 4 | Dennis-4 | Test | | 5 | Dennis-5 | Test | | 6 | Dennis-6 | NULL | | 7 | Dennis-7 | NULL | | 8 | Dennis-8 | NULL | | 9 | Dennis-9 | NULL | | 10 | Dennis-10 | NULL | +----+-----------+---------+ # 是否是和 left join 同樣了? >> inner join STRAIGHT_JOIN select a.id,a.name,b.dept_id from emp a ,emp_dept b where a.id=b.emp_id; mysql> select a.id,a.name,b.dept_id -> from emp a ,emp_dept b -> where a.id=b.emp_id; +----+----------+---------+ | id | name | dept_id | +----+----------+---------+ | 2 | Dennis-2 | DEv | | 1 | Dennis-1 | R&D | | 3 | Dennis-3 | R&D | | 4 | Dennis-4 | Test | | 5 | Dennis-5 | Test | +----+----------+---------+ 2.9.3. 別名 alias 你可以在GROUP BY、ORDER BY或在HAVING部分中使用別名引用列。別名也可以用來爲列取一個更好點的名字: SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt > 0; SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt > 0; SELECT id AS "Customer identity" FROM table_name; 注意,你的 ANSI SQL 不一樣意你在一個WHERE子句中引用一個別名。這是因爲在WHERE代碼被運行時,列值還可能沒有終結。比例如如下列查詢是不合法: SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt > 0 GROUP BY id; WHERE語句被運行以肯定哪些行應該包含GROUP BY部分中,而HAVING用來決定應該僅僅用結果集合中的哪些行。 2.9.4. 正則 正則表達式(regex)是定義複雜查詢的一個強有力的工具。 這裏是一個簡單的資料,它忽略了一些具體的信息。 正則表達式定義了一個字符串的規則。最簡單的正則表達式不包含不論什麼保留字。好比, 正則表達式hello僅僅和字符串「hello」匹配。 通常的正則表達式使用了某些特殊的結構,因此它能匹配不少其它的字符串。好比,正則 表達式hello|word既能匹配字符串「hello」也能匹配字符串「word」。 舉一個更復雜一點的樣例,正則表達式B[an]*s可以匹配字符串「Bananas」、「Baaaaa s」 、「Bs」以及其它不論什麼以B開頭以s結尾的字符串,中間可以包含隨意個a和隨意個n的組 合。 一個正則表達式中的可以使用下面保留字 ^ 所匹配的字符串之後面的字符串開頭 mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配) mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配) $ 所匹配的字符串曾經面的字符串結尾 mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配) mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配) .. 匹配不論什麼字符(包含新行) mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配) mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配) a* 匹配隨意0-n多個a(包含空串) mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配) mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配) a+ 匹配隨意1-n多個a(不包含空串) mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配) a? 匹配0-1個a mysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配) mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配) de|abc 匹配de或abc mysql> select "pi" REGEXP "pi|apa"; -> 1(表示匹配) mysql> select "axe" REGEXP "pi|apa"; -> 0(表示不匹配) mysql> select "apa" REGEXP "pi|apa"; -> 1(表示匹配) mysql> select "apa" REGEXP "^(pi|apa)$"; -> 1(表示匹配) mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配) mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配) (abc)* 匹配隨意多個(0-n個)abc(包含空串) mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配) mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配) mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配) {1} {2,3} 這是一個更全面的方法,它可以實現前面好幾種保留字的功能 a* 可以寫成a{0,} a+ 可以寫成a{1,} a? 可以寫成a{0,1} 在{}內僅僅有一個整型參數i,表示字符僅僅能出現i次;在{}內有一個整型參數i, 後面跟一個「,」,表示字符可以出現i次或i次以上;在{}內僅僅有一個整型參數i, 後面跟一個「,」,再跟一個整型參數j,表示字符僅僅能出現i次以上,j次下面 (包含i次和j次)。當中的整型參數必須大於等於0,小於等於 RE_DUP_MAX(默認是25 5)。 假設有兩個參數,第二個必須大於等於第一個 [a-dX] 匹配「a」、「b」、「c」、「d」或「X」 [^a-dX] 匹配除「a」、「b」、「c」、「d」、「X」之外的不論什麼字符。 「[」、「]」必須成對使用 mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配) mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配) mysql> select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1(表示匹配) mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配) mysql> select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1(表示匹配) mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配) ------------------------------------------------------------ [[.characters.]] 表示比較元素的順序。在括號內的字符順序是惟一的。但是括號中可以包含通配符, 因此他能匹配不少其它的字符。舉例來講:正則表達式[[.ch.]]*c匹配chchcc的前五個字符 。 [=character_class=] 表示相等的類,可以取代類中其它相等的元素,包含它本身。好比,假設o和(+)是 一個相等的類的成員,那麼[[=o=]]、[[=(+)=]]和[o(+)]是全然等價的。 [:character_class:] 在括號中面,在[:和:]中間是字符類的名字,可以表明屬於這個類的所有字符。 字符類的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、uppe r、cntrl、print和xdigit mysql> select "justalnums" REGEXP "[[:alnum:]]+"; -> 1(表示匹配) mysql> select "!!" REGEXP "[[:alnum:]]+"; -> 0(表示不匹配) [[:<:> [[:>:]] 分別匹配一個單詞開頭和結尾的空的字符串,這個單詞開頭和結尾都不是包含在alnum中 的字符也不能是下劃線。 mysql> select "a word a" REGEXP "[[:<:>:]]"; -> 1(表示匹配) mysql> select "a xword a" REGEXP "[[:<:>:]]"; -> 0(表示不匹配) mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1(表示 匹配) 2.9.5. Select 中使用 IF Statement mysql> select * from test; +------+------+------+-------+ | dept | id | sex | name | +------+------+------+-------+ | 1 | 1 | 0 | wang | | 2 | 2 | 1 | zhang | | 3 | 3 | 0 | li | +------+------+------+-------+ 3 rows in set (0.00 sec) mysql> select dept,id,if(sex=0,'女','男') sex,name from test; +------+------+-----+-------+ | dept | id | sex | name | +------+------+-----+-------+ | 1 | 1 | 女 | wang | | 2 | 2 | 男 | zhang | | 3 | 3 | 女 | li | +------+------+-----+-------+ 3 rows in set (0.00 sec) 2.9.6. Select中使用CASE Statement mysql> select dept,id,(case sex when '0' then '女' else '男' end) as sex,name from test; +------+------+------+-------+ | dept | id | sex | name | +------+------+------+-------+ | 1 | 1 | 女 | wang | | 2 | 2 | 男 | zhang | | 3 | 3 | 女 | li | +------+------+------+-------+ mysql> select (case dept when '1' then 'no1' when '2' then 'no2' else 'other' end) as dept from test; +-------+ | dept | +-------+ | no1 | | no2 | | other | +-------+ 3 rows in set (0.00 sec) 注意: 至關於Oracle 中的decode 和case when 在統計報表中很是實用處 2.10. 存儲過程和函數 CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' routine_body: Valid SQL procedure statement or statements 樣例:建立一個過程hello,顯示問候語 mysql> delimiter ; mysql> drop PROCEDURE if exists hello; Query OK, 0 rows affected (0.00 sec) mysql> delimiter // mysql> mysql> CREATE PROCEDURE hello (IN s varchar(20)) -> BEGIN -> SELECT CONCAT('Hello,',s,'!') as hello; -> END; -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call hello('wangyl'); +---------------+ | hello | +---------------+ | Hello,wangyl! | +---------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) 樣例2: 查詢t表的記錄總數 mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL simpleproc(@a); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a; +------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec) 樣例:建立一個函數 mysql> delimiter ; mysql> drop FUNCTION if exists dateFunction; Query OK, 0 rows affected (0.00 sec) mysql> delimiter // mysql> CREATE FUNCTION dateFunction (iCase int) -> RETURNS varchar(50) -> begin -> DECLARE iType int; -> DECLARE sReturn varchar(50); -> set iType =icase +1; -> case iType -> when 1 then select DATE_FORMAT(NOW(),'%Y-%m-%d') into sReturn; -> when 2 then select DATE_FORMAT(NOW(),'%W %M %Y') into sReturn; -> else -> select NOW() into sReturn; -> end case; -> return sReturn; -> end; -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> select dateFunction(0); +-----------------+ | dateFunction(0) | +-----------------+ | 2005-11-14 | +-----------------+ 1 row in set (0.00 sec) mysql> select dateFunction(1); +----------------------+ | dateFunction(1) | +----------------------+ | Monday November 2005 | +----------------------+ 1 row in set (0.00 sec) mysql> select dateFunction(2); +---------------------+ | dateFunction(2) | +---------------------+ | 2005-11-14 15:05:43 | +---------------------+ 1 row in set (0.00 sec) 2.11. 補充:trigger CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ); DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END| DELIMITER ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0); If you insert the following values into table test1 as shown here: mysql> INSERT INTO test1 VALUES -> (1), (3), (1), (7), (1), (8), (4), (4); Query OK, 8 rows affected (0.01 sec) Records: 8 Duplicates: 0 Warnings: 0 Then the data in the four tables will be as follows: mysql> SELECT * FROM test1; +------+ | a1 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +------+ 8 rows in set (0.00 sec) mysql> SELECT * FROM test2; +------+ | a2 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +------+ 8 rows in set (0.00 sec) mysql> SELECT * FROM test3; +----+ | a3 | +----+ | 2 | | 5 | | 6 | | 9 | | 10 | +----+ 5 rows in set (0.00 sec) mysql> SELECT * FROM test4; +----+------+ | a4 | b4 | +----+------+ | 1 | 3 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 0 | | 10 | 0 | +----+------+ 10 rows in set (0.00 sec) 2.12. 刪除 DELETE Syntax Single-table syntax: DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] Multiple-table syntax: DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition] Or: DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition] 對於刪除多個表,不能使用order by 和limit 多表刪除語法一: ,僅僅是在刪除 在from 前面的表所中匹配的記錄 DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id; 從t1,t2,t3 表選出要刪除的記錄,僅僅是刪除t1,t2 表中所匹配得這些記錄. 多表刪除語法二: 在from 列出的表中刪除選中的記錄. DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id; 從t1,t2,t3 表選出要刪除的記錄(使用using ),僅僅是刪除t1,t2 表中所匹配得這些記錄. 注意: 假設您使用一個別名,您必須使用別名. DELETE t1 FROM test AS t1, test2 WHERE ... 支持多個數據之間的多表刪除,但是在這樣的狀況下,你必須指定表,而不能使用別名: DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ... 當前,您不能從一樣表的子查詢中,刪除同一表的數據 拋出異常的愛 1 星期前 1016錯誤:文件沒法打開,使用後臺修復或者使用phpmyadmin進行修復。 1044錯誤:數據庫用戶權限不足,請聯繫空間商解決 1045錯誤:數據庫server/數據庫username/數據庫名/數據庫password錯誤,請聯繫空間商檢查賬戶。 1054錯誤:程序文件跟數據庫有衝突,請使用正確的程序文件上傳上去覆蓋。 1146錯誤:數據表缺失,請恢復備份數據. 1005:建立表失敗 1006:建立數據庫失敗 1007:數據庫已存在,建立數據庫失敗 1008:數據庫不存在,刪除數據庫失敗 1009:不能刪除數據庫文件致使刪除數據庫失敗 1010:不能刪除數據文件夾致使刪除數據庫失敗 1011:刪除數據庫文件失敗 1012:不能讀取系統表中的記錄 1020:記錄已被其它用戶改動 1021:硬盤剩餘空間不足,請加大硬盤可用空間 1022:keyword反覆,更改記錄失敗 1023:關閉時錯誤發生 1024:讀文件錯誤 1025:更更名字時錯誤發生 1026:寫文件錯誤 1032:記錄不存在 1036:數據表是僅僅讀的,不能對它進行改動 1037:系統內存不足,請從新啓動數據庫或從新啓動server 1038:用於排序的內存不足,請增大排序緩衝區 1040:已到達數據庫的最大鏈接數,請加大數據庫可用鏈接數 1041:系統內存不足 1042:無效的主機名 1043:無效鏈接 1044:當前用戶沒有訪問數據庫的權限 1045:不能鏈接數據庫,username或password錯誤 1048:字段不能爲空 1049:數據庫不存在 1050:數據表已存在 1051:數據表不存在 1054:字段不存在 1065:無效的SQL語句,SQL語句爲空 1081:不能創建Socket鏈接 1114:數據表已滿,不能容納不論什麼記錄 1116:打開的數據表太多 1129:數據庫出現異常,請從新啓動數據庫 1130:鏈接數據庫失敗,沒有鏈接數據庫的權限 1133:數據庫用戶不存在 1141:當前用戶無權訪問數據庫 1142:當前用戶無權訪問數據表 1143:當前用戶無權訪問數據表中的字段 1146:數據表不存在 1147:沒有定義用戶對數據表的訪問權限 1149:SQL語句語法錯誤 1158:網絡錯誤,出現讀錯誤,請檢查網絡鏈接情況 1159:網絡錯誤,讀超時,請檢查網絡鏈接情況 1160:網絡錯誤,出現寫錯誤,請檢查網絡鏈接情況 1161:網絡錯誤,寫超時,請檢查網絡鏈接情況 1062:字段值反覆,入庫失敗 1169:字段值反覆,更新記錄失敗 1177:打開數據表失敗 1180:提交事務失敗 1181:回滾事務失敗 1203:當前用戶和數據庫創建的鏈接已到達數據庫的最大鏈接數,請增大可用的數據庫鏈接數或從新啓動數據庫 1205:加鎖超時 1211:當前用戶沒有建立用戶的權限 1216:外鍵約束檢查失敗,更新子表記錄失敗 1217:外鍵約束檢查失敗,刪除或改動主表記錄失敗 1226:當前用戶使用的資源已超過所贊成的資源,請從新啓動數據庫或從新啓動server 1227:權限不足,您無權進行此操做 1235:MySQL版本號太低,不具備本功能 2002:Can't connect to ...一般意味着沒有一個MySQLserver運行在系統上或當試圖鏈接mysqldserver時,你正在使用一個錯誤的套接字文件或TCP/IP端口。 說明:以上僅僅是常見錯誤號,並且解決的方法也不必定確定管用!具體請參考MYSQL手冊(各大下載站均有下載) 不少其它具體錯誤代碼 錯誤名稱 / 錯誤代碼 SQL狀態 ER_HASHCHK 1000 HY000 ER_NISAMCHK 1001 HY000 ER_NO 1002 HY000 ER_YES 1003 HY000 ER_CANT_CREATE_FILE 1004 HY000 ER_CANT_CREATE_TABLE 1005 HY000 ER_CANT_CREATE_DB 1006 HY000 ER_DB_CREATE_EXISTS 1007 HY000 ER_DB_DROP_EXISTS 1008 HY000 ER_DB_DROP_DELETE 1009 HY000 ER_DB_DROP_RMDIR 1010 HY000 ER_CANT_DELETE_FILE 1011 HY000 ER_CANT_FIND_SYSTEM_REC 1012 HY000 ER_CANT_GET_STAT 1013 HY000 ER_CANT_GET_WD 1014 HY000 ER_CANT_LOCK 1015 HY000 ER_CANT_OPEN_FILE 1016 HY000 ER_FILE_NOT_FOUND 1017 HY000 ER_CANT_READ_DIR 1018 HY000 ER_CANT_SET_WD 1019 HY000 ER_CHECKREAD 1020 HY000 ER_DISK_FULL 1021 HY000 ER_DUP_KEY 1022 23000 ER_ERROR_ON_CLOSE 1023 HY000 ER_ERROR_ON_READ 1024 HY000 ER_ERROR_ON_RENAME 1025 HY000 ER_ERROR_ON_WRITE 1026 HY000 ER_FILE_USED 1027 HY000 ER_FILSORT_ABORT 1028 HY000 ER_FORM_NOT_FOUND 1029 HY000 ER_GET_ERRNO 1030 HY000 ER_ILLEGAL_HA 1031 HY000 ER_KEY_NOT_FOUND 1032 HY000 ER_NOT_FORM_FILE 1033 HY000 ER_NOT_KEYFILE 1034 HY000 ER_OLD_KEYFILE 1035 HY000 ER_OPEN_AS_READONLY 1036 HY000 ER_OUTOFMEMORY 1037 HY001 ER_OUT_OF_SORTMEMORY 1038 HY001 ER_UNEXPECTED_EOF 1039 HY000 ER_CON_COUNT_ERROR 1040 08004 ER_OUT_OF_RESOURCES 1041 08004 ER_BAD_HOST_ERROR 1042 08S01 ER_HANDSHAKE_ERROR 1043 08S01 ER_DBACCESS_DENIED_ERROR 1044 42000 ER_ACCESS_DENIED_ERROR 1045 42000 ER_NO_DB_ERROR 1046 42000 ER_UNKNOWN_COM_ERROR 1047 08S01 ER_BAD_NULL_ERROR 1048 23000 ER_BAD_DB_ERROR 1049 42000 ER_TABLE_EXISTS_ERROR 1050 42S01 ER_BAD_TABLE_ERROR 1051 42S02 ER_NON_UNIQ_ERROR 1052 23000 ER_SERVER_SHUTDOWN 1053 08S01 ER_BAD_FIELD_ERROR 1054 42S22 ER_WRONG_FIELD_WITH_GROUP 1055 42000 ER_WRONG_GROUP_FIELD 1056 42000 ER_WRONG_SUM_SELECT 1057 42000 ER_WRONG_VALUE_COUNT 1058 21S01 ER_TOO_LONG_IDENT 1059 42000 ER_DUP_FIELDNAME 1060 42S21 ER_DUP_KEYNAME 1061 42000 ER_DUP_ENTRY 1062 23000 ER_WRONG_FIELD_SPEC 1063 42000 ER_PARSE_ERROR 1064 42000 ER_EMPTY_QUERY 1065 42000 ER_NONUNIQ_TABLE 1066 42000 ER_INVALID_DEFAULT 1067 42000 ER_MULTIPLE_PRI_KEY 1068 42000 ER_TOO_MANY_KEYS 1069 42000 ER_TOO_MANY_KEY_PARTS 1070 42000 ER_TOO_LONG_KEY 1071 42000 ER_KEY_COLUMN_DOES_NOT_EXITS 1072 42000 ER_BLOB_USED_AS_KEY 1073 42000 ER_TOO_BIG_FIELDLENGTH 1074 42000 ER_WRONG_AUTO_KEY 1075 42000 ER_READY 1076 00000 ER_NORMAL_SHUTDOWN 1077 00000 ER_GOT_SIGNAL 1078 00000 ER_SHUTDOWN_COMPLETE 1079 00000 ER_FORCING_CLOSE 1080 08S01 ER_IPSOCK_ERROR 1081 08S01 ER_NO_SUCH_INDEX 1082 42S12 ER_WRONG_FIELD_TERMINATORS 1083 42000 ER_BLOBS_AND_NO_TERMINATED 1084 42000 ER_TEXTFILE_NOT_READABLE 1085 HY000 ER_FILE_EXISTS_ERROR 1086 HY000 ER_LOAD_INFO 1087 HY000 ER_ALTER_INFO 1088 HY000 ER_WRONG_SUB_KEY 1089 HY000 ER_CANT_REMOVE_ALL_FIELDS 1090 42000 ER_CANT_DROP_FIELD_OR_KEY 1091 42000 ER_INSERT_INFO 1092 HY000 ER_UPDATE_TABLE_USED 1093 HY000 ER_NO_SUCH_THREAD 1094 HY000 ER_KILL_DENIED_ERROR 1095 HY000 ER_NO_TABLES_USED 1096 HY000 ER_TOO_BIG_SET 1097 HY000 ER_NO_UNIQUE_LOGFILE 1098 HY000 ER_TABLE_NOT_LOCKED_FOR_WRITE 1099 HY000 ER_TABLE_NOT_LOCKED 1100 HY000 ER_BLOB_CANT_HAVE_DEFAULT 1101 42000 ER_WRONG_DB_NAME 1102 42000 ER_WRONG_TABLE_NAME 1103 42000 ER_TOO_BIG_SELECT 1104 42000 ER_UNKNOWN_ERROR 1105 HY000 ER_UNKNOWN_PROCEDURE 1106 42000 ER_WRONG_PARAMCOUNT_TO_PROCEDURE 1107 42000 ER_WRONG_PARAMETERS_TO_PROCEDURE 1108 HY000 ER_UNKNOWN_TABLE 1109 42S02 ER_FIELD_SPECIFIED_TWICE 1110 42000 ER_INVALID_GROUP_FUNC_USE 1111 42000 ER_UNSUPPORTED_EXTENSION 1112 42000 ER_TABLE_MUST_HAVE_COLUMNS 1113 42000 ER_RECORD_FILE_FULL 1114 HY000 ER_UNKNOWN_CHARACTER_SET 1115 42000 ER_TOO_MANY_TABLES 1116 HY000 ER_TOO_MANY_FIELDS 1117 HY000 ER_TOO_BIG_ROWSIZE 1118 42000 ER_STACK_OVERRUN 1119 HY000 ER_WRONG_OUTER_JOIN 1120 42000 ER_NULL_COLUMN_IN_INDEX 1121 42000 ER_CANT_FIND_UDF 1122 HY000 ER_CANT_INITIALIZE_UDF 1123 HY000 ER_UDF_NO_PATHS 1124 HY000 ER_UDF_EXISTS 1125 HY000 ER_CANT_OPEN_LIBRARY 1126 HY000 ER_CANT_FIND_DL_ENTRY 1127 HY000 ER_FUNCTION_NOT_DEFINED 1128 HY000 ER_HOST_IS_BLOCKED 1129 HY000 ER_HOST_NOT_PRIVILEGED 1130 HY000 ER_PASSWORD_ANONYMOUS_USER 1131 42000 ER_PASSWORD_NOT_ALLOWED 1132 42000 ER_PASSWORD_NO_MATCH 1133 42000 ER_UPDATE_INFO 1134 HY000 ER_CANT_CREATE_THREAD 1135 HY000 ER_WRONG_VALUE_COUNT_ON_ROW 1136 21S01 ER_CANT_REOPEN_TABLE 1137 HY000 ER_INVALID_USE_OF_NULL 1138 42000 ER_REGEXP_ERROR 1139 42000 ER_MIX_OF_GROUP_FUNC_AND_FIELDS 1140 42000 ER_NONEXISTING_GRANT 1141 42000 ER_TABLEACCESS_DENIED_ERROR 1142 42000 ER_COLUMNACCESS_DENIED_ERROR 1143 42000 ER_ILLEGAL_GRANT_FOR_TABLE 1144 42000 ER_GRANT_WRONG_HOST_OR_USER 1145 42000 ER_NO_SUCH_TABLE 1146 42S02 ER_NONEXISTING_TABLE_GRANT 1147 42000 ER_NOT_ALLOWED_COMMAND 1148 42000 ER_SYNTAX_ERROR 1149 42000 ER_DELAYED_CANT_CHANGE_LOCK 1150 HY000 ER_TOO_MANY_DELAYED_THREADS 1151 HY000 ER_ABORTING_CONNECTION 1152 08S01 ER_NET_PACKET_TOO_LARGE 1153 08S01 ER_NET_READ_ERROR_FROM_PIPE 1154 08S01 ER_NET_FCNTL_ERROR 1155 08S01 ER_NET_PACKETS_OUT_OF_ORDER 1156 08S01 ER_NET_UNCOMPRESS_ERROR 1157 08S01 ER_NET_READ_ERROR 1158 08S01 ER_NET_READ_INTERRUPTED 1159 08S01 ER_NET_ERROR_ON_WRITE 1160 08S01 ER_NET_WRITE_INTERRUPTED 1161 08S01 ER_TOO_LONG_STRING 1162 42000 ER_TABLE_CANT_HANDLE_BLOB 1163 42000 ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 1164 42000 ER_DELAYED_INSERT_TABLE_LOCKED 1165 HY000 ER_WRONG_COLUMN_NAME 1166 42000 ER_WRONG_KEY_COLUMN 1167 42000 ER_WRONG_MRG_TABLE 1168 HY000 ER_DUP_UNIQUE 1169 23000 ER_BLOB_KEY_WITHOUT_LENGTH 1170 42000 ER_PRIMARY_CANT_HAVE_NULL 1171 42000 ER_TOO_MANY_ROWS 1172 42000 ER_REQUIRES_PRIMARY_KEY 1173 42000 ER_NO_RAID_COMPILED 1174 HY000 ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE 1175 HY000 ER_KEY_DOES_NOT_EXITS 1176 HY000 ER_CHECK_NO_SUCH_TABLE 1177 42000 ER_CHECK_NOT_IMPLEMENTED 1178 42000 ER_CANT_DO_THIS_DURING_AN_TRANSACTION 1179 25000 ER_ERROR_DURING_COMMIT 1180 HY000 ER_ERROR_DURING_ROLLBACK 1181 HY000 ER_ERROR_DURING_FLUSH_LOGS 1182 HY000 ER_ERROR_DURING_CHECKPOINT 1183 HY000 ER_NEW_ABORTING_CONNECTION 1184 08S01 ER_DUMP_NOT_IMPLEMENTED 1185 HY000 ER_FLUSH_MASTER_BINLOG_CLOSED 1186 HY000 ER_INDEX_REBUILD 1187 HY000 ER_MASTER 1188 HY000 ER_MASTER_NET_READ 1189 08S01 ER_MASTER_NET_WRITE 1190 08S01 ER_FT_MATCHING_KEY_NOT_FOUND 1191 HY000 ER_LOCK_OR_ACTIVE_TRANSACTION 1192 HY000 ER_UNKNOWN_SYSTEM_VARIABLE 1193 HY000 ER_CRASHED_ON_USAGE 1194 HY000 ER_CRASHED_ON_REPAIR 1195 HY000 ER_WARNING_NOT_COMPLETE_ROLLBACK 1196 HY000 ER_TRANS_CACHE_FULL 1197 HY000 ER_SLAVE_MUST_STOP 1198 HY000 ER_SLAVE_NOT_RUNNING 1199 HY000 ER_BAD_SLAVE 1200 HY000 ER_MASTER_INFO 1201 HY000 ER_SLAVE_THREAD 1202 HY000 ER_TOO_MANY_USER_CONNECTIONS 1203 42000 ER_SET_CONSTANTS_ONLY 1204 HY000 ER_LOCK_WAIT_TIMEOUT 1205 HY000 ER_LOCK_TABLE_FULL 1206 HY000 ER_READ_ONLY_TRANSACTION 1207 25000 ER_DROP_DB_WITH_READ_LOCK 1208 HY000 ER_CREATE_DB_WITH_READ_LOCK 1209 HY000 ER_WRONG_ARGUMENTS 1210 HY000 ER_NO_PERMISSION_TO_CREATE_USER 1211 42000 ER_UNION_TABLES_IN_DIFFERENT_DIR 1212 HY000 ER_LOCK_DEADLOCK 1213 40001 ER_TABLE_CANT_HANDLE_FULLTEXT 1214 HY000 ER_CANNOT_ADD_FOREIGN 1215 HY000 ER_NO_REFERENCED_ROW 1216 23000 ER_ROW_IS_REFERENCED 1217 23000 ER_CONNECT_TO_MASTER 1218 08S01 ER_QUERY_ON_MASTER 1219 HY000 ER_ERROR_WHEN_EXECUTING_COMMAND 1220 HY000 ER_WRONG_USAGE 1221 HY000 ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1222 21000 ER_CANT_UPDATE_WITH_READLOCK 1223 HY000 ER_MIXING_NOT_ALLOWED 1224 HY000 ER_DUP_ARGUMENT 1225 HY000 ER_USER_LIMIT_REACHED 1226 42000 ER_SPECIFIC_ACCESS_DENIED_ERROR 1227 HY000 ER_LOCAL_VARIABLE 1228 HY000 ER_GLOBAL_VARIABLE 1229 HY000 ER_NO_DEFAULT 1230 42000 ER_WRONG_VALUE_FOR_VAR 1231 42000 ER_WRONG_TYPE_FOR_VAR 1232 42000 ER_VAR_CANT_BE_READ 1233 HY000 ER_CANT_USE_OPTION_HERE 1234 42000 ER_NOT_SUPPORTED_YET 1235 42000 ER_MASTER_FATAL_ERROR_READING_BINLOG 1236 HY000 ER_WRONG_FK_DEF 1237 42000 ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1238 HY000 ER_CARDINALITY_COL 1239 21000 ER_SUBSELECT_NO_1_ROW 1240 21000 ER_UNKNOWN_STMT_HANDLER 1241 HY000 ER_CORRUPT_HELP_DB 1242 HY000 ER_CYCLIC_REFERENCE 1243 HY000 ER_AUTO_CONVERT 1244 HY000 ER_ILLEGAL_REFERENCE 1245 42S22 ER_DERIVED_MUST_HAVE_ALIAS 1246 42000 ER_SELECT_REDUCED 1247 01000 ER_TABLENAME_NOT_ALLOWED_HERE 1248 42000 ER_NOT_SUPPORTED_AUTH_MODE 1249 08004 ER_SPATIAL_CANT_HAVE_NULL 1250 42000 ER_COLLATION_CHARSET_MISMATCH 1251 42000 ER_SLAVE_WAS_RUNNING 1252 HY000 ER_SLAVE_WAS_NOT_RUNNING 1253 HY000 ER_TOO_BIG_FOR_UNCOMPRESS 1254 HY000 ER_ZLIB_Z_MEM_ERROR 1255 HY000 ER_ZLIB_Z_BUF_ERROR 1256 HY000 ER_ZLIB_Z_DATA_ERROR 1257 HY000 ER_CUT_VALUE_GROUP_CONCAT 1258 HY000 ER_WARN_TOO_FEW_RECORDS 1259 01000 ER_WARN_TOO_MANY_RECORDS 1260 01000 ER_WARN_NULL_TO_NOTNULL 1261 01000 ER_WARN_DATA_OUT_OF_RANGE 1262 01000 ER_WARN_DATA_TRUNCATED 1263 01000 ER_WARN_USING_OTHER_HANDLER 1264 01000 ER_CANT_AGGREGATE_COLLATIONS 1265 42000 ER_DROP_USER 1266 42000 ER_REVOKE_GRANTS 1267 42000