此篇博客将记述在日常工作中,常用的 MySQL SQL 脚本。会持续的更新。
数据库用户创建和权限控制
# MySQL 创建 user # CREATE USER 'username'@'host' IDENTIFIED BY 'password'; # 例子: CREATE USER 'user_test'@'localhost' IDENTIFIED BY '123456'; # 开通访问权限 GRANT ALL ON *.* TO 'user_test'@'localhost' WITH GRANT OPTION; SHOW GRANTS FOR user_test@localhost; # 密码丢失之后处理 # 用 SET PASSWORD 命令 mysql -u user_test mysql> SET PASSWORD FOR 'user_test'@'localhost' = PASSWORD('newpass'); # 用 UPDATE 直接编辑 user 表 mysql -u user_test mysql> use mysql; mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'user_test'; mysql> FLUSH PRIVILEGES; # 在丢失 user_test 密码的时候,可以这样 mysqld_safe --skip-grant-tables& mysql -u user_test mysql mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='user_test'; mysql> FLUSH PRIVILEGES;
数据库备份 mysqldump 和还原 restore
# 从远程机器,导出数据库,包含 Schema 信息 mysqldump -hHost -uRoot -pPassword database_name > database_name20170316.sql # 导出数据库,包含 Schema 信息 mysqldump -uRoot -pPassword database_name > database_name20170316.sql # 指定导出数据表,包含 Schema 信息 mysqldump -uRoot -pPassword database_name user web_user > database_name_user20120907.sql # 导出数据库,不包含 Schema 信息,仅包含数据 mysqldump -uRoot -pPassword --no-create-db --no-create-info database_name > database_name-20180227.sql # 还原数据 mysql -u Root -p database_name < database_name_user20120907.sql
数据库设置。
# mysql error GROUP BY clause; this is incompatible with sql_mode=only_full_group_by SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode; # 一次性设置,服务重启后失效 SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); # 永久设置,重启后永久失效 /etc/mysql/mysql.conf.d mysqld.cnf [mysqld] sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
数据库查看,创建,删除等。
# Mysql create database utf8 编码 CREATE DATABASE IF NOT EXISTS supergw DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; # 查看数据库列表 show databases; # 删除数据 drop database db_name; # 使用数据库 use `test_db`; # 退出 exit;
表的创建,新建字段,新建索引,修改字段类型等。
# 创建表 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `email` int(11) DEFAULT NULL COMMENT '邮箱', `name` varchar(255) DEFAULT NULL COMMENT '名称', `price` decimal(10, 2) DEFAULT '0.00' COMMENT '定价', `position` int(11) DEFAULT 0 COMMENT '排序', `status` int(11) DEFAULT 0 COMMENT '状态', `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_users_on_name` (`name`), UNIQUE KEY `index_users_on_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; # 查看表的创建结构 show create table tablename \G; # 清空表至初始状态 truncate table tablename; # 删除表 drop table if exists `table_a`; # 增加字段,设置索引 ALTER table table_name Add column column_name57 integer AFTER column_name56; # 修改字段类型 ALTER TABLE tabel_name CHANGE column_name column_name LONGTEXT;
查询数据,将查询结果保存到临时表。
# 将查询结果保存到临时表 insert into temp_user_price(user_id,price,created_at)(select user_id,price,created_at from user_price where user_id = 1); # 判断字符的长度 select id,name from users where CHAR_LENGTH(name) > 7; # left join 查询右侧表,为空的情况 select a.user_id,b.id from table_a as a left join table_b as b on a.user_id = b.user_id where b.id is null; # COALESCE 函数从值列表中返回第一个非NULL的值,当遇到NULL值时将其替换为0。 UPDATE `users` SET `users_count` = COALESCE(`users_count`, 0) + 1 WHERE `users`.`id` = 26;
数据更新操作。
# 更新一条记录 update table_a set `name` = 'henry' where id = 1 limit 1; # 两个表关联后,更新其中一个表 update table_a,table_b set table_a.begin_day = table_b.begin_day, table_a.begin_price = table_b.begin_price where table_a.user_id = table_b.user_id;
2018-03-09