标签: MySQL

  • MySQL8插入表 导入数据时报错ERROR 1067 (42000): Invalid default value for ‘end_time‘

    MySQL8插入表 导入数据时报错ERROR 1067 (42000): Invalid default value for ‘end_time‘

    我们在使用mysqldump将数据库内容导出之后,重新导入到新的库中,出现了报错。

    问题描述及解决办法

    插入的表中其中有一个字段信息:`end_time` datetime not null default ‘0000-00-00 00:00:00’ comment ‘end time’,明显想要插入年月日未0的值。

    mysql中查询:select @@sql_mode或者select @@global.sql_mode查询出数据库严格模式的相关信息。mysql在5.7之后默认使用严格模式。

    mysql> select @@sql_mode;
    +-----------------------------------------------------------------------------------------------------------------------+
    | @@sql_mode |
    +-----------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
    +-----------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    mysql> select @@global.sql_mode;
    +-----------------------------------------------------------------------------------------------------------------------+
    | @@global.sql_mode |
    +-----------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
    +-----------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    可以看出有这两个属性:NO_ZERO_IN_DATE,NO_ZERO_DATE

    NO_ZERO_DATE影响月日为0的插入,NO_ZERO_IN_DATE影响年月日为0的插入,会影响到DATE、DATETIME、TIMESTAMP三种字段类型中对日期部分为0的处理。

    ####设置当前当前会话去掉NO_ZERO_IN_DATE,NO_ZERO_DATE

    再次插入表成功。

    source 命令导入

    source 命令导入数据库需要先登录到数库终端:

    mysql> use abc;                  # 使用已创建的数据库 
    mysql> set names utf8; # 设置编码
    mysql> source /home/abc/abc.sql # 导入备份数据库
  • AWS云服务器Bitnami套件安装WordPress更新php版本到7.4.33 图文教程

    AWS云服务器Bitnami套件安装WordPress更新php版本到7.4.33 图文教程

    今日有小伙伴找到老季,说想要把aws云ec2服务器WordPress网站环境从php7.3升级到php7.4的版本,我们这里也记录一下这个的更新过程。

    服务器情况

    无法连接aws的ec2服务器

    登录上aws也经历了一些波折,发现登录服务器,老是无法连接。要不就是卡住了一样。之后就没有反应了。

    要么就是提示:

    ———-ERROR——- Unable to start command: invalid uid and gid

    毫无办法,按理来说aws不可能会有这种,控制台都无法连接ec2服务器的问题。之后我们终于查到了问题,由于系统安装的是ubuntu,所以我们用终端连接时,需要使用ubuntu用户进行连接,具体如下图所示:

    Run As : ubuntu

    这就是重点了,如果是centos、debian等发型版用root即可。

    之后重新使用”会话管理器”菜单就可以连接了。

    已安装的环境bitnami套件

    登录上服务器,发现服务器使用的是/opt/bitnami/ctlscript.sh命令,所以断定是bitnami的套件,而官网并没有给出详细的套件,这里我们只能自己编译了。

    编译php7.4.33

    安装必要的环境包

    请先直接切换到root用户,然后使用如下命令进行批量下载并安装必要的包

    sudo su   //直接回车
    wget https://www.php.net/distributions/php-7.4.33.tar.gz
    tar -xvf php-7.4.33.tar.gz
    apt-get update
    apt-get install -y libxml2-dev libssl-dev libcurl4-openssl-dev libpng-dev libjpeg-dev libfreetype6-dev zlib1g-dev libzip-dev libsqlite3-dev libonig-dev

    No package ‘libxml-2.0’ found

    hecking for libxml-2.0 >= 2.7.6… no configure: error: Package requirements (libxml-2.0 >= 2.7.6) were not met: No package ‘libxml-2.0’ found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBXML_CFLAGS and LIBXML_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.

    但我们已经安装了libxml而且是最新的版本,在终端中指定一下路径:

    export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig
    

    No package ‘sqlite3’ found

    configure: error: Package requirements (sqlite3 > 3.7.4) were not met: No package ‘sqlite3’ found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SQLITE_CFLAGS and SQLITE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.

    apt-get install libsqlite3-dev

    No package ‘oniguruma’ found

    configure: error: Package requirements (oniguruma) were not met: No package ‘oniguruma’ found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables ONIG_CFLAGS and ONIG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.

    apt-get install libonig-dev

    配置PHP

    cd php-7.4.33
    ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --enable-mbstring --with-curl --with-openssl --with-zlib --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --enable-opcache --enable-xml --enable-intl --with-gd --with-jpeg --with-freetype --with-mysqli --with-pdo-mysql

    Your PHP installation appears to be missing the MySQL extension which is required by WordPress.

    一开始出现了Your PHP installation appears to be missing the MySQL extension which is required by WordPress.错误,是我们没有带上mysql的扩展--with-mysqli --with-pdo-mysql,以上编译时,我们已经带上了。

    编译和安装PHP7.4.33

    make
    sudo make install
    

    配置php.ini

    sudo cp php.ini-development /usr/local/php7/etc/php.ini

    编辑 /usr/local/php7/etc/php.ini

    找到mysqli.default_socketpdo_mysql.default_socket的配置区,将其设置成/opt/bitnami/mysql/tmp/mysql.sock

    mysqli.default_socket = "/opt/bitnami/mysql/tmp/mysql.sock"
    
    pdo_mysql.default_socket = "/opt/bitnami/mysql/tmp/mysql.sock"
    

    如不配置则会出现:Error establishing a database connection

    导致WordPress的运行php环境找不到mysql的链接方法

    配置php-fpm.conf

    编辑/usr/local/php7/etc/php-fpm.conf文件

    sudo vi /usr/local/php7/etc/php-fpm.conf

    内容如下:

    [global]
    pid = /run/php-fpm.pid
    error_log = /var/log/php-fpm/error.log
    [my_pool]
    user = daemon
    group = daemon
    ;listen = 127.0.0.1:9000
    listen = /var/run/php-fpm.sock
    listen.owner = daemon
    listen.group = daemon
    pm = dynamic
    pm.start_servers = 5
    pm.min_spare_servers = 2
    pm.max_spare_servers = 8
    pm.max_children = 12

    这里我们使用的用户及用户组都是daemon跟bitnami套件中apache设置的是一样的权限。

    检查一下/var/run/这个目录是否存在,不存在则需要创建。

    启动php-fpm

    /usr/local/php7/sbin/php-fpm

    可以通过 ps aux | grep php-fpm 命令查看我们的php是否允许成功

    如果有/usr/local/php7/etc/php-fpm.conf的配置在运行说明已成功。

    配置apache2

    修改/opt/bitnami/apache2/conf/php-fpm-apache.conf,修改前记得备份!!!

    修改配置前请确保:/usr/local/php7/etc/php-fpm.conf的php-fpm已在运行。

    /opt/bitnami/apache2/conf/php-fpm-apache.conf改为以下内容

    <IfDefine USE_PHP_FPM>
      <Proxy "unix:/var/run/php-fpm.sock|fcgi://www-fpm" timeout=300>
      </Proxy>
      <FilesMatch \.php$>
        <If "-f %{REQUEST_FILENAME}">
          SetHandler "proxy:fcgi://www-fpm"
        </If>
      </FilesMatch>
    </IfDefine>

    此处Proxy需要跟上面的php-fpm.conf配置的listen一致,否则apache2无法链接到php-fpm。

    重启bitnami的apache服务

    /opt/bitnami/ctlscript.sh restart apache
    

    检查php版本是否成功

    我们在网站目录中新建一个info.php内容如下

    <?php phpinfo();
    

    之后通过网址打开 http://域名/info.php 检查一下,php版本是否是7.4.33

    错误日志

    我们的配置过程中出现了一些未知错误,还好有日志可以查询,下面我们指一下日志位置,有需要的小伙伴可能会用到。

    tail -n 20 /opt/bitnami/apache2/logs/error_log

    至此,教程结束,可能不算十分完整,但大概过程就是这样的。请小伙伴们指正~

  • DigitalOcean 通过收购 SnapShooter 扩展备份功能

    DigitalOcean 通过收购 SnapShooter 扩展备份功能

    DigitalOcean 的 Currents 报告显示,初创企业和中小型企业 (SMB) 不断转向云,以增强其业务的敏捷性、可扩展性和成本效益——57% 的企业表示到 2022 年对云的依赖将会增加。 然而,许多企业担心的一个问题是由于意外删除、技术堆栈更改或服务中断而导致的数据中断。 丢失数据可能会导致收入损失、声誉受损和客户体验不佳,这对成长中的小型企业尤其有害。

    为了更好地帮助初创公司和中小企业跨文件、应用程序和数据库保护其云数据,我们很高兴地宣布 DigitalOcean 收购备份和恢复解决方案提供商 SnapShooter。 SnapShooter 使云备份变得简单、快速且灵活,提供一个系统来整合所有备份,让您可以放心地知道您的云数据受到保护。

    以下是 SnapShooter 客户 Siebird(一家网页设计和数字营销机构)对他们的体验的评价:

    “2.5 年来,Siebird 一直信任 SnapShooter 来备份和保护我们的客户网站。 我们在 DigitalOcean 上托管所有客户网站。 从一开始,SnapShooter 就因其轻松配置备份而脱颖而出。 我们一直害怕设置新的备份作业,现在不用了。 我们知道我们的客户网站受到保护并且只需单击一个按钮即可恢复,因此我们可以放心。”

    定期备份让您高枕无忧

    SnapShooter 使用户能够从 DigitalOcean 和其他云提供商备份文件、应用程序和数据库。 它还支持 Laravel 和 WordPress 等流行应用程序以及 MongoDB、MySQL 和 PostgreSQL 等数据库。 可以每天、每周和每月从服务器备份进行全面备份,或者最多每 5 分钟进行一次文件备份。

    SnapShooter 将备份整合到单个作业中,用户可以轻松配置该作业以满足其特定需求,从而无需手动备份。 例如,运行 WordPress 的用户可以备份其应用程序文件,并立即生成 MySQL 备份。

    快速创新的企业还可以轻松地恢复单个文件或完整应用程序的先前版本,只需选择要恢复的文件,确认您的选择,SnapShooter 将完成剩下的工作。 选择要备份的文件、自定义设置和灵活的保留策略的能力将帮助初创公司和中小企业为其云数据构建高效且经济高效的业务连续性策略。

    SnapShooter 的主要功能包括:

    • 备份来自多个提供商的文件、服务器、应用程序和数据库
    • 快速恢复一个或多个文件的先前版本
    • 粒度备份,能够选择要备份的文件
    • 选择备份频率,并查看备份的运行时间
    • 自定义您的备份设置和保留策略
    • 获取实时日志和监控
    • 通过两因素身份验证和安全加密保持安全并合规
    • 使用您自己的存储,包括 DigitalOcean Spaces、AWS S3、Filebase 和其他系统,或使用 SnapShooter 的 S3 兼容存储
    • 获取备份的电子邮件和松弛警报

    开始使用 SnapShooter

    要立即开始备份应用程序、文件和数据库,您可以从 SnapShooter 网站开始。 DigitalOcean 用户可以受益于 SnapShooter 的一键式应用程序,这使得将 SnapShooter 备份添加到 DigitalOcean 产品(包括 Droplets 虚拟机和 Volumes 块存储)变得简单。 注册包年套餐,您将获得 SnapShooter 定价折扣!

    以下是低代码 IOT 平台 Datacake 客户对于将 SnapShooter 与 DigitalOcean 结合使用的评价:

    “从自建解决方案切换到 SnapShooter 后,我们自 2021 年起一直使用 SnapShooter 进行数据库备份。 我们使用它来将 DigitalOcean 管理和自我管理的 Postgres 数据库备份到 DigitalOcean Spaces。 自从使用 SnapShooter 以来,我们感到非常安心,因为我们知道我们拥有可靠且有效的历史备份。 报告功能对我们也非常有帮助。 总的来说,我们喜欢 SnapShooter,因为它为我们提供了确保我们的业务数据始终安全可靠所需的功能和可靠性。”

    我们很高兴 Hatch 校友 SnapShooter 加入 DigitalOcean,并期待为您提供未来的更新!

  • mysql命令 – MySQL服务器的客户端工具

    mysql命令是MySQL数据库服务器的客户端工具,它工作在命令行终端中,完成对远程MySQL数据库服务器的操作。

    语法格式:  mysql [参数] [数据库]

    常用参数:

    -hMySQL服务器的ip地址或主机名
    -u连接MySQL服务器的用户名
    -e执行MySQL内部命令
    -p连接MySQL服务器的密码

    参考实例

    连接本地MySQL服务器,并打开数据库:

    [root@jiloc ~]# mysql -h localhost -u root -p jiloc

    连接远程MySQL服务器:

    [root@jiloc ~]# mysql -h 192.168.60.60 -u root -p  jiloc 
  • mysqladmin命令 – MySQL服务器客户端管理工具

    mysqladmin命令是MySQL服务器管理任务的客户端工具,它可以检查MySQL服务器的配置和当前工作状态,创建和删除数据库,创建用户和修改用户密码等操作。

    语法格式 : mysqladmin [参数] [管理命令]

    常用参数:

    -hMySQL服务器主机名或ip地址
    -u连接MySQL服务器的用户名
    -p连接MySQL服务器的密码
    — -help显示帮助信息

    mysqladmin命令支持的MySQL服务器管理命令非常丰富,可以通过“- -help”显示可用的管理命令。

    参考实例

    查看服务器当前状态:

    [root@jiloc ~]# mysqladmin  -u root -p status 
    Enter password:  
    Uptime: 26  Threads: 1  Questions: 2  Slow queries: 0  Opens: 67  Flush tables: 1  Open tables: 60  Queries per second avg: 0.076 

    修改root密码:

    [root@jiloc ~]# mysqladmin -u root -poldpassword password 'jiloc'

    检查mysqlserver是否可用:

    [root@jiloc ~]# mysqladmin -u root -p ping mysqld is alive 

    创建新数据库:

    [root@jiloc ~]# mysqladmin -u root -p create mysql_jiloc
  • mysqlimport命令 – MySQL服务器数据导入

    mysqlimport命令为MySQL数据库服务器提供了一种命令行方式导入数据工具,它从特定格式的文本文件中读取数据插入MySQL数据库表中。

    语法格式 : mysqlimport [参数]

    常用参数:

    -D导入数据前清空表
    -f出现错误时继续处理剩余的操作
    -hMySQL服务器的ip地址或主机名
    -u连接MySQL服务器的用户名
    -p连接MySQL服务器的密码

    使用mysqlimport命令像MySQL服务器导入数据时需要注意文件的编码格式,否则可能导致导入的数据出现乱码。

    参考实例

    导入数据库:

    [root@jiloc ~]# mysqlimport -u root --local jiloc.sql --fields-terminated-by="|"

    导入本文到数据库:

    [root@jiloc ~]# mysqlimport -v -u root -p jiloc_db jiloc.txt
  • Mysql插入数据:不存在则插入,存在则跳过或更新

    Mysql插入数据:不存在则插入,存在则跳过或更新

    很多时候我们在做数据插入的时候需要判断一下当前我插入的数据是否已经存在于数据库中。

    一般情况下我们会写两条sql去操作

    select 查询当前插入的数据是否已经存在如果不存在就插入新的记录,如果存在就提示用户该记录已经存在在mysql里面可以这么操作,如果记录存在就跳过或者更新,不存在就插入!

    IGNORE

    这个是根据插入表的主键和唯一索引去匹配的,如果当前插入的记录存在则跳过不插入。

    示例:

    INSERT IGNORE INTO `user` (‘phone’) VALUES (‘18888888888’);

    此时user表中phone字段是唯一的,如果有这条记录则不执行插入操作,如果出现重复数据,将不返回错误,只是以警告形式返回。

    on duplicate key update

    主键或者唯一索引有重复时,则执行update操作

    示例:

    假设有一张表,id为主键,并且表中已经存在了id=1,likes=5的记录,此时下面两条sql等价。

    INSERT INTO TABLENAME (id,likes) VALUES (1,18) ON DUPLICATE KEY UPDATE likes=likes+1;

    UPDATE TABLENAME SET likes=likes+1 WHERE id=1;

    如果是插入值,返回受影响行数为1,如果执行了更新操作那么返回的受影响行数为2.

    如果条件是针对于主键操作的,那么此操作是无效操作,等同于ignore

    如果一次性插入多条记录,此时id为主键,或者a是一个unique索引,并且表中已经存在的记录。

    INSERT INTO TABLENAME (id,likes) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE likes = likes+1;

    执行后likes的值为变成5,因为在插入前已经存在了id=1的记录,上面的sql等于执行了两条update语句。

    NOTE:INSERT INTO TABLENAME……ON DUPLICATE KEY UPDATE……,这样的sql中,假如插入的记录在表中一种有重复值(与主键、唯一索引匹配),那么则会执行update操作,如果在插入的时候表中没有重复值,那么就会执行insert操作。

    问题:现在问题来了,如果INSERT多行记录, ON DUPLICATE KEY UPDATE后面字段的值怎么指定?要知道一条INSERT语句中只能有一个ON DUPLICATE KEY UPDATE,到底他会更新一行记录,还是更新所有需要更新的行。这个问题困扰了我很久了,其实使用VALUES()函数一切问题都解决了。

    如果表中已经有id=1,likes=18 ;id=2,likes=19的两条记录,如果插入语句中有id=1或者id=2的记录,则更新原有记录,否则插入新行。

    最后强调一下:

    注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!

    INSERT……SELECT……WHERE NOT EXISTS

    NOTE:根据查询条件判断是否已经有对应的值,有的话跳过,没有的话执行插入,随便想查什么就查什么,这个用得最多。

    REPLACE INTO

    如果存与主键或者唯一索引相同的记录,那么则会先删除,然后在插入新记录。

    注意:如果有两个主键或者唯一索引,必须要值全部匹配才会执行替换操作,否则执行插入操作,详情见官网。

    MySQL对REPLACE(和 LOAD DATA … REPLACE)使用以下算法 :

    尝试将新行插入表中插入失败,因为主键或唯一索引发生重复键错误:从表中删除具有重复键值的冲突行再次尝试将新行插入表中

  • 腾讯云 云服务器精选爆品 轻量服务器 2核2G4M/5M 1.2折年付¥72元/年

    腾讯云 云服务器精选爆品 轻量服务器 2核2G4M/5M 1.2折年付¥72元/年

    腾讯云QCloud 618超级爆品活动 2022 6.1 ~ 6.14活动之后,老季发现腾讯云又开启了云服务器精选爆品的活动。

    腾讯云云服务器精选爆品,购买链接直达: https://www.jiloc.com/go/qcloud-act

    购买即赠·专区,产品首单专享

    最长免费续费3个月,活动规则>>  

    • 本专区内商品都不支持退款
    • 购买15天内需至领赠页面领取福利
    • 同一账号,赠送福利限领取1次

    新人·专区,产品首单专享

    秒杀·专区

    新老·同享

    爆款热卖、音视频通信、云数据库、CDN&存储、AI应用、中间件&大数据频道等

    更多活动

    更有域名专场等其他活动。有需要的小伙伴可以看看。

  • mysql导入sql文件的时候报告ERROR: ASCII ‘\0’ appeared in the statement

    mysql导入sql文件的时候报告ERROR: ASCII ‘\0’ appeared in the statement

    问题描述

    今天导入SQL文件,但是执行的时候发现如下错误提示:

    ERROR: 
    ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: ''.
    Bye

    解决办法

    登入的时候加–binary-mode=1

    mysql --binary-mode=1 -h127.0.0.1 -uroot -p123456 -P3306
    mysql> use db;
    mysql> source /data/jiloc.sql

  • MySQL 字符串类型转换为数字 排序操作

    MySQL 字符串类型转换为数字 排序操作

    最近项目中在写sql时,遇到要按字符串类型的数字排序,直接排序不行,那就需要把字符串类型转换成数字后,再进行排序。

    字符串格式的话排序是这样的:

    1 10 11 12 2 20 21 …

    这种排列顺序不是我们想要的。

    想要转化成数字,变成 1 2 10 11 20 21 的顺序。

    三种解决方法:

    1.数字后面直接加0,即:(value+0)格式

    select * from sys_user order by (sort+0) desc

    2.使用cast()函数,即:cast(value as type)格式

    select * from sys_user order by cast(sort as signed) desc

    3.使用convert()函数,即:convert(value , type)格式

    select * from sys_user order by convert(sort , signed) desc

    备注:value 代表字符串类型的字段 ,type代表要转换的类型 signed为整数类型

  • 数据库中的共享锁与排他锁

    数据库中的共享锁与排他锁

    共享锁,又称为读锁,获得共享锁之后,可以查看但无法修改和删除数据。

    排他锁,又称为写锁、独占锁,获得排他锁之后,既能读数据,又能修改数据。

    为什么要加锁

    很多人都知道,锁是用来解决并发问题的,那么什么是并发问题呢?并发情况下,不加锁会有什么问题呢?

    拿生活中的洗手间举例子,每个洗手间都会有一个门,并且是可以上锁的,当我们进入洗手间之后会把门反锁,当我们出来之后再把锁打开。

    当门被锁上之后,其他人只能在门外等待。洗手间之所以要有门锁,就是为了保护隐私的,避免出现多个人同时进入洗手间的情况。

    这和数据库中的锁其实是一样的,为了避免多个事务同时操作数据库导致数据异常,一般会通过锁机制解决。

    在介绍共享锁和排他锁之前,我们先来大个比方,前面已经用了一个洗手间的例子,那么就继续这个例子。一般情况下,我们进入洗手间有可能做一下几件事:洗手、化妆、上厕所等,其实只要上厕所这件事是极度隐私的,而其他事没有那么隐私。

    我们可以认为洗手间就是一个数据库表,而洗手间内部的设施就是数据库表中的数据。我们每个想要进入洗手间的人都是一个事务,简单的洗手、化妆等操作可以认为是读操作,而上厕所操作可以认为是写操作。

    共享锁

    前面简单介绍了数据库与洗手间之间的类比关系,那么接下来继续分析什么是共享锁。

    有些时候,如果我们进入洗手间只是想洗手的话,我们一般不会锁门。而其他人也可以进来洗手、化妆等。但是,其他人是不可以进来上厕所的。

    这就是共享锁,也叫读锁。就是我们对数据进行读取操作的时候,其实是不会改变数据的值的。

    所以我们可以给数据库增加读锁,获得读锁的事务就可以读取数据了。当数据库已经被别人增加了读锁的时候,其他新来的事务也可以读数据,但是不能写。

    也就是说,如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

    用法

    在查询语句后面增加LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁。

    SELECT ... LOCK IN SHARE MODE;

    当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

    排他锁

    介绍完了共享锁后,在来说说互斥锁。

    如果我们进入洗手间只是想洗手,那么我们可以允许其他人也进来洗手。但是,如果我们进入洗手间是为了上厕所,那么任何人不能再进来做任何事。

    这就是排他锁,也叫写锁。就是我们对数据进行写操作的时候,要先获得写锁,获得写锁的事务既可以写数据也可以读数据。但是,如果数据库已经被别人增加了排他写锁,那么后面的事务是无法在获得该数据库的任何锁的。

    也就是说,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

    用法

    在查询语句后面增加FOR UPDATE,Mysql会对查询结果中的每行都加排他锁

    SELECT ... FOR UPDATE;

    当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

    加锁原则

    拿MySql的InnoDB引擎来说,对于insertupdatedelete等操作。会自动给涉及的数据加排他锁;

    对于一般的select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。

    共享锁:SELECT ... LOCK IN SHARE MODE;

    排他锁:SELECT ... FOR UPDATE;

  • mysql excel数据生成sql insert语句

    mysql excel数据生成sql insert语句

    excel表格中有A、B、C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age 。

    在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下:

    1、增加一列(D列)

    2、在第一行的D列,就是D1中输入公式: =CONCATENATE("insert into users (name,sex,age) values ('",A1,"','",B1,"','",C1,"');")

    =CONCATENATE("insert IGNORE  into items (id,item,price) values ('",A2,"','",B2,"','",D2,"');")

    Mysql插入数据:不存在则插入,存在则跳过或更新

    3、此时D1已经生成了如下的sql语句: “insert into users (name,sex,age) values (‘ls’,’女’,’24’)”;

    4、将D1的公式复制到所有行的D列

    5、此时D列已经生成了所有的sql语句

    6、把D列复制到一个纯文本文件中

    7、去掉SQL语句的双引号  

WeChat