mysql 技术总结

linux 系统 安装mysql 5.7推荐文章

http://www.cnblogs.com/gaojupeng/p/5727069.html


以前自己的保存的技术文档,都在自己的硬盘上,后来硬盘出错4年积累的功能技术文档,项目代码全部都不存在了,于是思前想后决定,以后将自己的技术都分享出来,这样既可以帮助别人又可以永久保存,双赢。因为我用到的mysql技术会不断的深入,本文档会持续的更新。

一、Linux 下的使用:

 查询mysql的安装情况:rpm -qa|grep -i Mysql 只显示mysql的安装程序,不加i有其他的


1、安装服务
MySQL-server-5.6.23-1.linux_glibc2.5.x86_64.rpm
2、安装客户端
MySQL-client-5.6.23-1.linux_glibc2.5.x86_64.rpm
3、刚安装没有密码
提示 You must SET PASSWORD before executing this statement
    mysql>SET PASSWORD = PASSWORD('123456');

绿色版:window下的。设置path后 
  mysql -u root 
   mysql> use mysql;
   mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
   
4、远程连接还没有复权,针对用户复权
提示 :ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    或者:'Access denied for user 'root'@'localhost' (using password: YES)' 
    mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' 


5、密码过期修改密码
# mysqladmin -u USER -p password PASSWORD;


6、ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)


7、绿色版解压后,首先增加 环境变量讲 \bin目录加入 到path里面 然后进行3的无密码操作。


8、启动mysql service mysqld start

9、Error Code: 2006 - MySQL server has gone away 

情况有多重,sql执行时间过长、sql执行中进程被杀死,

或者最大信息包数值小 (修改此值如下)

show global variables like 'max_allowed_packet';
 set global max_allowed_packet=1024*1024*16;

二、windows

1、windows 安装mysql后,如果 cmd 启动mysql时提示“不是内部或外部命令,也不是可运行的程序”。在环境变量下面,加入 MYSQL_HOME 并将%MYSQL_HOME%\bin 加入%PATH%下.

三、sql、函数、索引、试图、触发器

函数

(1) 日期、字符串转换

  date_format(date,'%Y-%m-%d') -------------->oracle中的to_char();

  str_to_date(date,'%Y-%m-%d') -------------->oracle中的to_date();

  %Y:代表4位的年份

  %y:代表2为的年份

  %m:代表月, 格式为(01……12)

  %c:代表月, 格式为(1……12)

  %d:代表月份中的天数,格式为(00……31)

  %e:代表月份中的天数, 格式为(0……31)

  %H:代表小时,格式为(00……23)

  %k:代表 小时,格式为(0……23)

  %h: 代表小时,格式为(01……12)

  %I: 代表小时,格式为(01……12)

  %l :代表小时,格式为(1……12)

  %i: 代表分钟, 格式为(00……59)

  %r:代表 时间,格式为12 小时(hh:mm:ss [AP]M)

  %T:代表 时间,格式为24 小时(hh:mm:ss)

  %S:代表 秒,格式为(00……59)

  %s:代表 秒,格式为(00……59)

(2)mysql自带加密算法

加密:无法再解密,mysql没有提供相应的解密方法 SELECT PASSWORD(PASSWORD) FROM users;
加密:SELECT ENCODE(userName,'123') FROM users;
解密:SELECT DECODE(ENCODE(userName,'123'),'123') FROM users;
####windows 不支持
加密:SELECT ENCRYPT(userName,'123') FROM users;

加密:SELECT   AES_ENCRYPT(userName, '123') FROM users;
解密:SELECT   AES_DECRYPT(AES_ENCRYPT(userName, '123'), '123') FROM users;

sql

(1) usersEditLog 表内有多条  userId,editStatus 字段相同 的数据,如果去除想要数据的id,再根据id 获取去掉那些重复的数据。

SELECT * FROM usersEditLog WHERE id IN ( 
SELECT one.id FROM ( 
SELECT userId,editDate,id FROM usersEditLog WHERE editStatus = 3 AND userId IN ( 44 , 51 ) 
ORDER BY userId,editDate DESC ) ONE GROUP BY userId 

(2)表字段增加,删除,修改字段,  修改表名  字段后面课追加 属性设置 default 0 not null auto_increment ,add primary key (new_field_id); 


添加字段  添加一个字符串字段 ,并设置默认值 ALTER TABLE users  ADD (autoWithdraw VARCHAR(16) DEFAULT 'NO')

ALTER TABLE account_trade_record ADD money NUMERIC(12,4) COMMENT '转账金额'


删除字段 ALTER TABLE users  DROP COLUMN autoWithdraw ; 
 

  修改字段 类型 将字段修改为 Integer  ALTER TABLE users MODIFY autoWithdraw INTEGER; 

修改字段默认值ALTER TABLE   company_fund_profit ALTER  COLUMN is_settle SET  DEFAULT 'NOTSETTLED';


修改字段 名称 ,指定新字段的类型 ALTER TABLE users CHANGE autoWithdraw autoWithdrawTwo  INTEGER ;

修改表名    alter table users rename users_;

不为空字段,修改为允许为空  ALTER TABLE company_info MODIFY  postalCode  VARCHAR(16)  NULL;

(3)、索引的创建

不是所有的字段都需要建立索引,也不是所有的索引都100%有用。组合索引很多时候是无效的,比如

 CREATE INDEX索引名称 ON表名 (字段名,字段名...); 如:CREATE INDEX user_bank_map_index ON user_bank_map (userId);

(4)、七日收益率sql,sql中定义变量

SELECT
id ,
productid,
account_no,  
IFNULL(purchase_amount, 0) AS purchase_amount,
IFNULL(tranche_purchase, 0)  AS tranche_purchase,
IFNULL(interestrate, 0)  AS interestrate,
IFNULL(Interest_amount, 0) AS Interest_amount,
IFNULL(interest_amount_day, 0) AS interest_amount_day,
interest_time
FROM (

SELECT @cdate :=DATE_ADD(@cdate, INTERVAL - 1 DAY) days
 FROM (SELECT @cdate := DATE('2017-08-09') FROM sx_t_c_depositinterest_history LIMIT 7) t1 ORDER BY days
     ASC) dates
LEFT JOIN (SELECT id ,
productid,
account_no,  
IFNULL(purchase_amount, 0) AS purchase_amount,
IFNULL(tranche_purchase, 0)  AS tranche_purchase,
IFNULL(interestrate, 0)  AS interestrate,
IFNULL(Interest_amount, 0) AS Interest_amount,
IFNULL(interest_amount_day, 0) AS interest_amount_day,
interest_time 
FROM
sx_t_c_depositinterest_history
WHERE
  account_no = 'p23aaa1998bcd4c6aa4e7be4713e5ba11'
AND interest_time >=DATE('2017-08-03')
AND interest_time <=DATE('2017-08-09')
AND productid =125
         
ORDER BY
interest_time ASC) history
ON dates.days = history.interest_time
ORDER BY history.interest_time 


四、创建库的完整操作  连接数据库 mysql -uroot -p123456 -h127.0.0.1

1、创建数据库  create database ams;

2、创建用户   命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 

说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器. 

例子: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; 
CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456'; 
CREATE USER 'pig'@'%' IDENTIFIED BY '123456'; 
CREATE USER 'pig'@'%' IDENTIFIED BY ''; 
CREATE USER 'pig'@'%'; 

create users 'ams'@'%' identified by '123456';

3、授权 
命令:GRANT privileges ON databasename.tablename TO 'username'@'host' 

说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL.;databasename -数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*. 

例子: GRANT SELECT, INSERT ON test.user TO 'pig'@'%'; 
GRANT ALL ON *.* TO 'pig'@'%'; 
grant all on ams.* to 'ams'@'%';
注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令: 

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; 


五、触发器的使用

触发器的创建语法

 DELIMITER '$$'  #sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题

 DROP TRIGGER IF EXISTS file_efile_num_sny_trigger '$$'#sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `salaryshop`.`file_efile_num_sny_trigger` BEFORE/AFTER INSERT/UPDATE/DELETE
    ON `salaryshop`.`<Table Name>`
    FOR EACH ROW BEGIN
    END '$$' #sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题
DELIMITER ; #sqlyog工具自带的


1、创建触发器(在t_class_info 内新增一条数据时,在 class_info 内同样新增一条数据

新增数据触发器

DELIMITER '$$' #sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题

CREATE TRIGGER info_tri
AFTER INSERT ON t_class_info FOR EACH ROW 

BEGIN

# new. 代表新增的数据
INSERT INTO class_info VALUES(new.id,new.t_no,new.t_name,new.t_addr);
END;
'$$' #sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题

SELECT * FROM class_info;

SELECT * FROM t_class_info;

INSERT INTO t_class_info VALUES(2,2,'张三丰','新增数据');



修改数据触发器

DELIMITER '$$'  #sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题
CREATE TRIGGER info_tri_update
AFTER UPDATE ON t_class_info FOR EACH ROW 
BEGIN
UPDATE class_info SET t_name=new.`t_name` WHERE id=new.`id`;
END;
'$$' #sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题

SELECT * FROM class_info;
SELECT * FROM t_class_info;
#gdsdfs
INSERT INTO t_class_info VALUES(2,2,'张三丰','新增数据');


UPDATE  t_class_info  SET  t_name='李四李111' WHERE id =2 AND t_addr IS NOT NULL;


根据以上写法,可以写出 删除数据触发器



自己写的一个完成的触发器小程序,

功能:文件包含子文件,子文件添加数据后,修改文件包含子文件的数量

文件表

CREATE TABLE file_1 (
id INTEGER AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
file_name VARCHAR(32) COMMENT '文件名称',
efile_num INTEGER DEFAULT 0 COMMENT '电子文件名称'
)
电子文件表
CREATE TABLE efile_1 (
id INTEGER AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
pid INTEGER COMMENT '所属文件id',
efile_name VARCHAR(32) COMMENT '文件名称'
)

#插入处理触发器

DELIMITER '$$' #sqlyog工具自带的  单引号 ' 需要去掉 这里加上因为 csdn 格式问题
USE `salaryshop` '$$'   #使用库
DROP TRIGGER /*!50032 IF EXISTS */ `file_efile_num_sny_trigger`'$$'
CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `file_efile_num_sny_trigger` AFTER INSERT ON `efile_1` 
    FOR EACH ROW BEGIN
 UPDATE file_1 SET efile_num = (SELECT COUNT(id) FROM efile_1 WHERE pid = new.pid ) WHERE id=new.pid;
END;
'$$'
DELIMITER ;


#删除数据处理触发器

DELIMITER '$$'
USE `salaryshop`'$$'
DROP TRIGGER /*!50032 IF EXISTS */ `efile_num_trigger_delete`'$$'
CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `efile_num_trigger_delete` BEFORE DELETE ON `efile_1` 
    FOR EACH ROW BEGIN
 UPDATE file_1 SET efile_num= (efile_num-1) WHERE id=old.pid;
END;
'$$'
DELIMITER ;


电子文件插入数据
INSERT INTO efile_1(pid,efile_name) VALUE(1,'测试电子文件1');

删除数据

DELETE FROM efile_1 WHERE id =3;
查看两个表内数据
SELECT * FROM efile_1;
SELECT * FROM file_1;


六、自定义函数

函数定义语法

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    FUNCTION `test`.`a`()
    RETURNS TYPE
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
    BEGIN
         RETURN ;
    END  '$$' 


[NOT] DETERMINISTIC:这个是用于binlog和主从复制等!DETERMINISTIC是确定的,意思就是写入binlog的时候,写入的是一个指定的常量;如unix_timestamp()获取到的值是1,可能写入binlog的时候,unix_timestamp()获取到的时间戳却成了3了,这个时候会出现数据不一致问题,所以引入了DETERMINISTIC!这是binlog安全的一种机制!一般情况下,NOT DETERMINISTIC不允许使用,会报如下错误:
Error Code : 1418
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
可以从报错内容里面发现,设置log_bin_trust_function_creators函数就可以使用NOT DETERMINISTIC,但是二进制安全性极差!


CONTAINS SQL表示子程序不包含读或写数据的语句;

NO SQL表示子程序不包含SQL语句。

READS SQL DATA表示子程序包含读数据的语句,但不包含写数据的语句。

MODIFIES SQL DATA表示子程序包含写数据的语句。

如果这些特征没有明确给定,默认的是CONTAINS SQL。

SQL SECURITY { DEFINER | INVOKER};就是执行时的权限检查;如果一个函数定义为访问a表中的记录!这个时候就有权限检查。DEFINER就是以创建者的权限去检查,INVOKER是以执行者的权限去检查!



创建一个序列表 ,系统根据需要定义自己的序列,及增长值。

CREATE TABLE `sequence` (
  `name` varchar(50) NOT NULL,
  `current_value` int(11) NOT NULL,
  `increment` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1、定义一个获取序列当前值的函数


DELIMITER'$$'


USE `salaryshop` '$$'


DROP FUNCTION IF EXISTS `currval`'$$'


CREATE DEFINER=`salaryshop`@`172.19.6.75` FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS INT(11)
    DETERMINISTIC
BEGIN
         DECLARE VALUE INTEGER;
         SET VALUE = 0;
         SELECT current_value INTO VALUE
                   FROM sequence
                   WHERE NAME = seq_name;
         RETURN VALUE;
END '$$'


DELIMITER ;

2、定一个去下一个序列值的 函数

DELIMITER  '$$'


USE `salaryshop`'$$'


DROP FUNCTION IF EXISTS `nextval`'$$'


CREATE DEFINER=`salaryshop`@`172.19.6.75` FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS INT(11)
    DETERMINISTIC
BEGIN
         UPDATE sequence
                   SET current_value = current_value + increment
                   WHERE NAME = seq_name;
         RETURN currval(seq_name);
END '$$'


DELIMITER ;

#自己定义函数,日期格式转换

DELIMITER'$$'
DROP FUNCTION  IF EXISTS data_format_self '$$'
CREATE 
    FUNCTION data_format_self()
    RETURNS VARCHAR(32) DETERMINISTIC  #  DETERMINISTIC 函数是必须的,基本都是 DETERMINISTIC  ,NOT DETERMINISTIC 情况很少。
    BEGIN
         RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
    END '$$'
DELIMITER ;

# sql调用 自定义函数

SELECT data_format_self();

七、存储过程

语法定义:

DELIMITER'$$'
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE `salaryshop`.`1`()
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
    BEGIN
    END '$$'
DELIMITER ;


1、

这个存储过程是获取 公司当前最大的编号使用

DELIMITER'$$'


USE `salaryshop`'$$'


DROP PROCEDURE IF EXISTS `proc_sequ_upt`'$$'

# 指明为哪个数据库,定义的。  proc_sequ_upt 为存储过程名称
CREATE DEFINER=`salaryshop`@`172.19.6.75` PROCEDURE `proc_sequ_upt`()
BEGIN
DECLARE i_curr INT(11);
DECLARE i_increment INT(11);
DECLARE i_num INT(11);

#将查询出来的 current_value,increment 赋值给 i_curr ,i_increment  这个sql 应该有where,只是我们实际项目里面就一条护具他没有加where条件

SELECT current_value,increment INTO i_curr,i_increment FROM sequence;

#修改库里面 现有的值
UPDATE sequence
  SET
  current_value=i_curr + i_increment
        WHERE NAME='TestSeq';

#返回刚刚修改的值,这种写法很费事
SELECT current_value INTO i_num FROM sequence WHERE NAME='TestSeq';
SELECT i_num;
END '$$'

DELIMITER ;


改良后的存储过程,去掉了i_num ,加上了应该有的where

DELIMITER'$$'


USE `salaryshop`'$$'


DROP PROCEDURE IF EXISTS `proc_sequ_upt_new`'$$'


CREATE  PROCEDURE `proc_sequ_upt_new`()
BEGIN
DECLARE i_curr INT(11);
DECLARE i_increment INT(11);


SELECT current_value,increment INTO i_curr,i_increment FROM sequence WHERE NAME='TestSeq';
UPDATE sequence
  SET
  current_value=i_curr + i_increment
        WHERE NAME='TestSeq';
SELECT current_value  FROM sequence WHERE NAME='TestSeq';


END '$$'


DELIMITER ;

存储过程调用:CALL proc_sequ_upt_new();

2、存储过程实例



(1) 传入参数,像数据库传入数据

DELIMITER'$$'
USE `sj`'$$'
DROP PROCEDURE IF EXISTS `proc_accountitem_insert`'$$'
CREATE DEFINER=`sj`@`%` PROCEDURE `proc_accountitem_insert`(IN i_id VARCHAR(32),
 i_accountNo VARCHAR(45),
 i_bankAccountNo VARCHAR(45),
 i_accountType VARCHAR(45),
 i_status VARCHAR(45),
 i_amount DECIMAL(10,2),
 i_remark VARCHAR(50))
BEGIN
INSERT INTO t_c_accountItem (
id,
account_no,
bank_account_no,
account_type,
STATUS,
amount,
create_time,
update_time,
remark
)
VALUES
(
i_id,
i_accountNo,
i_bankAccountNo,
i_accountType,
i_STATUS,
i_amount,
NOW(),
NOW(),
i_remark
);
  CALL proc_accountitem_sign(i_id);

END '$$'

DELIMITER ;

# 统计file_1表内的efile_num的值,(来自efile_1表内 的关系数据)

DELIMITER'$$'
DROP PROCEDURE IF EXISTS efile_num_syn '$$'
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE efile_num_syn()

    BEGIN
UPDATE file_1 f SET f.efile_num =( SELECT COUNT(id) FROM efile_1 e WHERE e.pid=f.id);
    END '$$'
DELIMITER ;


八、mysql 定时器

定时器语法

DELIMITER '$$'

-- SET GLOBAL event_scheduler = ON '$$'     -- required for event to execute but not create    


CREATE /*[DEFINER = { user | CURRENT_USER }]*/EVENT `salaryshop`.`1`


ON SCHEDULE
/* uncomment the example below you want to use */


-- scheduleexample 1: run once


  --  AT 'YYYY-MM-DD HH:MM.SS'/CURRENT_TIMESTAMP { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] }


-- scheduleexample 2: run at intervals forever after creation


  -- EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]


-- scheduleexample 3: specified start time, end time and interval for execution
  /*EVERY 1  [HOUR|MONTH|WEEK|DAY|MINUTE|...]


  STARTS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1[HOUR|MONTH|WEEK|DAY|MINUTE|...] }


  ENDS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] } */


/*[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']*/


DO
BEGIN
   (sql_statements)
END '$$'


DELIMITER ;

DELIMITER'$$'

DROP EVENT IF EXISTS efile_num '$$'

CREATE EVENT efile_num ON SCHEDULE EVERY 1 MINUTE ON COMPLETION NOT PRESERVE ENABLE DO
BEGIN 
  
CALL efile_num_syn();
  
END '$$'


DELIMITER ;



九、试图

试图语法

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]
 

其中,CREATE:表示新建视图;

REPLACE:表示替换已有视图

ALGORITHM :表示视图选择算法

view_name :视图名

column_list:属性列

select_statement:表示select语句

[WITH [CASCADED | LOCAL] CHECK OPTION]参数表示视图在更新时保证在视图的权限范围之内

可选的ALGORITHM子句是对标准SQL的MySQL扩展。

ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。

如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。

对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

对于UNDEFINED,MySQL自己选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,

这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

#创建试图

DROP VIEW IF EXISTS userView;

CREATE
    ALGORITHM = MERGE 

    VIEW userView(user_id,user_name,user_cls_bank_name)
    AS
SELECT u.id,u.userName,b.clsBankName FROM personal_user u INNER JOIN 
user_bank_map b ON b.userId = u.id

#调用试图

SELECT * FROM userView;


十、索引

#组合索引

CREATE INDEX userId_userType ON user_bank_map (userId,userType); 

#单列索引

CREATE INDEX mobileTel_index ON users (officeTel); 

#唯一索引  可以是单列,也可以是多列

CREATE UNIQUE INDEX  mobileTel_officeTel_unique_index_ ON personal_user (mobileTel,officeTel);

#删除索引(空表,如果有数据会报错)

DROP INDEX index_name ON table_name




问题汇总:

1、项目在操作MYSQL数据库一VARCHAR字段时出现“1292 truncated incorrect double value ”错误。

MYSQL手册上写着:

错误:1292 SQLSTATE: 22007 (ER_TRUNCATED_WRONG_VALUE) 

消息:截短了不正确的%s值: '%s'


什么号截短了不正确的的%s值?难道还不允许直接为null或者直接赋值。思考再三不解。最后在网上发现一些其他的可能与之相关的情况,不过也不完全一样。他人的情况多为字符串相加错误地采用了“+”,而不是库函数“concat”。利用此方法将字段串相加即解决了。但关键是我的问题是直接赋值,而不是进行字符串连接。真搞不懂。最后还是采用了concat函数:concat(Str,’’)来变相的解决了。


特殊sql

1、固定值作为字段默认值

SELECT  id,id,key_validate,create_date ,'NOT_ALLOW_OPEN' AS credit_interest_status FROM sx_t_m_personal_consumer_info ;


2、一张表数据写入另一张表

INSERT INTO sx_t_m_personal_consumer_info_network 
(id,consumer_name,consumer_code,law_type,law_no,mobile_tel
,office_tel,email,create_date,nationality,remark,data_status)

SELECT id,consumer_name,consumer_code,law_type,law_no,mobile_tel
,office_tel,email,create_date,nationality,remark,data_status FROM sx_t_m_personal_consumer_info ;


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值