Table of Contents
Mysql Document
https://dev.mysql.com/doc/refman/5.7/en/
https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-data-definition.html
如何打开MySQL中root账户的远程登录
安装完成mysql数据,也不想创建其他用户了,直接用root吧,可是其他机器无法远程访问
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root";
flush privileges;
第一句中"%"表示任何主机都可以远程登录到该服务器上访问。如果要限制只有某台机器可以访问,将其换成相应的IP即可,如: GRANT ALL PRIVILEGES ON . TO root@"172.168.193.25" IDENTIFIED BY "root"; 第二句表示从mysql数据库的grant表中重新加载权限数据。因为MySQL把权限都放在了cache中,所以在做完更改后需要重新加载。
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
可以看到绑定的地址为127.0.0.1。正常应该是0.0.0.0 修改/etc/mysql/my.cnf,需要root用户权限。找到文件中的:
bind-address = 127.0.0.1
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN -
tcp 0 0 192.168.1.105:3306 192.168.1.100:51240 ESTABLISHED -
mysql> select version(),current_date;
select version(),current_date;
+-----------+--------------+
| version() | current_date |
+-----------+--------------+
| 5.7.13 | 2017-02-26 |
+-----------+--------------+
1 row in set (0.02 sec)
mysql创建数据库指定字符集
GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
UTF8: CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql -u root -p
SOURCE C:/temp/sakila-db/sakila-schema.sql;
SOURCE C:/temp/sakila-db/sakila-data.sql;
CREATE DATABASE menagerie;
GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';
GRANT ALL ON sakila.* TO 'hvitssm'@'%';
安装
https://dev.mysql.com/downloads/repo/apt/
https://repo.mysql.com//mysql-apt-config_0.8.7-1_all.deb https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/ https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/#apt-repo-fresh-install https://dev.mysql.com/doc/refman/5.7/en/server-administration.html
sudo apt-get update
sudo apt-get install mysql-server
sudo service mysql status
sudo service mysql stop
sudo service mysql start
连接
mysql -h host -u user -p
查询
SELECT VERSION(), CURRENT_DATE;
select version(), current_date;
SeLeCt vErSiOn(), current_DATE;
SELECT SIN(PI()/4), (4+1)*5;
SELECT VERSION(); SELECT NOW();
SELECT USER()
SHOW DATABASES;
USE test
GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';
创建数据库
CREATE DATABASE menagerie;
USE menagerie
mysql -h host -u user -p menagerie
创建表
SHOW TABLES;
CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
SHOW TABLES;
DESCRIBE pet;
加载数据
LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet
-> LINES TERMINATED BY '\r\n';
使用批处理模式
mysql < batch-file
mysql -e "source batch-file"
mysql -h host -u user -p < batch-file
mysql < batch-file | more
mysql < batch-file > mysql.out
source filename;
\. filename
安装之后
#以root身份在终端登陆,必须
mysqladmin -u root -p password root
如果是mariadb,创建其他用户,并使用其他用户登陆
查询所有表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_TYPE ='BASE TABLE';
查询所有视图
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE ='VIEW';
查看所有函数
SELECT name from mysql.proc where type='function';
查询所有存储过程
SELECT name from mysql.proc where type='procedure'
查询所有触发器
SELECT * FROM information_schema.`TRIGGERS`;
select trigger_name from information_schema.`TRIGGERS`;
创建触发器
语法
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account
-> FOR EACH ROW PRECEDES ins_sum
-> SET
-> @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
-> @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
-> IF NEW.amount < 0 THEN
-> SET NEW.amount = 0;
-> ELSEIF NEW.amount > 100 THEN
-> SET NEW.amount = 100;
-> END IF;
-> END;//
mysql> delimiter ;
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);
INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);
SELECT * FROM test1;
SELECT * FROM test2
SELECT * FROM test3;
SELECT * FROM test4;
pointinfo 表结构
desc pointinfo;
+----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| POINTID | text | YES | | NULL | |
| EARTHID | text | YES | | NULL | |
| POINTLOCATION | text | YES | | NULL | |
| POINTLON | double | YES | | NULL | |
| POINTLAT | double | YES | | NULL | |
| POINTNAME | varchar(50) | YES | | NULL | |
| POINTTIME | datetime | YES | | NULL | |
| POINTGROUP | varchar(50) | YES | | NULL | |
| POINTPERSON | varchar(50) | YES | | NULL | |
| POINTINTENSITY | varchar(5) | YES | | NULL | |
| POINTCONTENT | text | YES | | NULL | |
| MSGTEL | varchar(11) | YES | | NULL | |
| MSGCONTENT | text | YES | | NULL | |
+----------------+-------------+------+-----+---------+-------+
13 rows in set (0.01 sec)
elt日志表
CREATE TABLE etllog(etllog_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
table_name text,
table_id text,
table_action int);
对于pointinfo表,创建触发器
mysql -uroot -h192.168.3.180 -Ddb20170303 -p
delimiter //
CREATE TRIGGER tbi_pointinfo BEFORE INSERT ON pointinfo
FOR EACH ROW
BEGIN
insert into etllog(table_name,table_id,table_action)
values('pointinfo',new.pointid,1);
END;//
delimiter ;;
insert into pointinfo(pointid,pointlocation) values('TTest001','这是一个测试地址');
delimiter //
CREATE TRIGGER tbu_pointinfo BEFORE update ON pointinfo
FOR EACH ROW
BEGIN
insert into etllog(table_name,table_id,table_action)
values('pointinfo',old.pointid,2);
END;//
delimiter ;
insert into pointinfo(pointid,pointlocation) values('TTest002','这是一个测试地址');
update pointinfo set pointlocation='这是另一个测试' where pointid='TTest002';
delimiter //
CREATE TRIGGER tbd_pointinfo BEFORE delete ON pointinfo
FOR EACH ROW
BEGIN
insert into etllog(table_name,table_id,table_action)
values('pointinfo',old.pointid,-1);
END;//
delimiter ;;
insert into pointinfo(pointid,pointlocation) values('DTTest003','这是一个测试地址');
delete from pointinfo where pointid='DTTest003';
delete from pointinfo where pointid like '%Test%';
delete from etllog;
insert into pointinfo(pointid,pointlocation) values('TTest001','这是一个测试地址');
insert into pointinfo(pointid,pointlocation) values('TTest002','这是一个测试地址');
update pointinfo set pointlocation='这是另一个测试' where pointid='TTest002';
insert into pointinfo(pointid,pointlocation) values('DTTest003','这是一个测试地址');
delete from pointinfo where pointid='DTTest003';
select * from etllog;
删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
储存过程for
Table: film
Create Table: CREATE TABLE `film` (
`film_id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`description` text,
`release_year` year(4) DEFAULT NULL,
`language_id` tinyint(3) unsigned NOT NULL,
`original_language_id` tinyint(3) unsigned DEFAULT NULL,
`rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3',
`rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`zd01` text,
`zd02` text,
`zd03` text,
`zd04` text,
`zd05` text,
`zd06` text,
`zd08` text,
`zd09` text,
`zd07` text,
`zd10` text,
`zd11` text,
`zd12` text,
`zd13` text,
`zd14` text,
`zd15` text,
`zd16` text,
`zd17` text,
`zd18` text,
`zd19` text,
`zd20` text,
PRIMARY KEY (`film_id`)
) ENGINE=InnoDB AUTO_INCREMENT=75536 DEFAULT CHARSET=utf8;
drop procedure if exists p_for_loop;
DELIMITER &&
create procedure p_for_loop()
begin
declare i int;
set i = 1;
loop_example : loop
select concat('index -> ', i);
insert into film(title,description,zd01,zd02,zd03,zd04,zd05,zd06,zd07,zd08,zd09,zd10,zd11,zd12,zd13,zd14,zd15,zd16,zd17,zd18,zd19,zd20)
values('测试速度'||i,concat('测试速度',i),'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i,'测试速度'||i);
set i = i + 1;
if i > 10000 then
leave loop_example;
end if;
end loop;
end &&
DELIMITER ;
call p_for_loop();
mysqldump: Error: Binlogging on server not active
log_bin=mysql-bin
server-id = 1