索引与外键

// 添加索引
ALTER TABLE orders ADD KEY order_ix_custid(cust_id);
// 删除索引
ALTER TABLE orders DROP KEY order_ix_custid;
// 添加外键
ALTER TABLE orderitem ADD CONSTRAINT fk_orderitem_orders FOREIGN KEY (order_id) REFERENCES orders (id);
// 添加外键,支持级联删除
ALTER TABLE orderitem ADD CONSTRAINT fk_orderitem_orders FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE;
// 删除外键
ALTER TABLE orderitem DROP FOREIGN KEY fk_orderitem_orders;
// 添加唯一索引
ALTER TABLE orderitem ADD UNIQUE KEY uc_orderitem(order_id, product_id);

order是MySQL的一个关键字,不要用来做表名,否则有坑。

触发器

// 创建AFTER INSERT触发器
DELIMITER #
CREATE TRIGGER trigger_new_product AFTER INSERT ON wishitem FOR EACH ROW
BEGIN
DECLARE new_url VARCHAR(128);
SELECT thumbnail_url FROM product WHERE id = NEW.product_id INTO new_url;
UPDATE wish SET thumbnail_url = new_url WHERE id = NEW.wish_id;
END #
DELIMITER ; // 创建AFTER DELETE触发器
DELIMITER #
CREATE TRIGGER trigger_del_product AFTER DELETE ON wishitem FOR EACH ROW
BEGIN
DECLARE prod_url VARCHAR(128);
DECLARE prod_time DATETIME;
SELECT cp.thumbnail_url, wi.add_time FROM wishitem AS wi INNER JOIN product AS cp on wi.product_id =
cp.id WHERE wi.wish_id = OLD.wish_id ORDER BY wi.add_time LIMIT 1 INTO prod_url, prod_time;
IF prod_url IS NULL THEN
SET prod_url = '';
END IF;
UPDATE wish SET thumbnail_url = prod_url WHERE id = OLD.wish_id;
END #
DELIMITER ; // 显示触发器
SHOW TRIGGERS; // 删除触发器
DROP TRIGGER trigger_new_product;

replace into

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.

INSERT ... ON DUPLICATE KEY UPDATE

If you specify an ON DUPLICATE KEY UPDATE clause and a row to be inserted would cause a duplicate value in a UNIQUEindex or PRIMARY KEY, an UPDATE of the old row occurs.

REPLACE INTO是先删除再插入,如果主键是AUTO_INCREMENT,会导致主键自增。

现有一个表wishitems

可以使用 SHOW CREATE TABLE wishitem 查看表的AUTO_INCREMENT值

CREATE TABLE wishitem (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
wish_id bigint(20) unsigned NOT NULL DEFAULT '',
product_id bigint(20) unsigned NOT NULL DEFAULT '',
add_time datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY uc_wishitem (wish_id, product_id),
CONSTRAINT fk_wishitem_wish FOREIGN KEY (wish_id) REFERENCES wish (id) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=15000000000000000038 DEFAULT CHARSET=utf8

现在执行

REPLACE INTO wishitem(wish_id, product_id) VALUES(14000000000000000009,99999100000000037)

再次查看表中数据

再次使用 SHOW CREATE TABLE wishitem 查看表的AUTO_INCREMENT值

CREATE TABLE wishitem (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
wish_id bigint(20) unsigned NOT NULL DEFAULT '',
product_id bigint(20) unsigned NOT NULL DEFAULT '',
add_time datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY uc_wishitem (wish_id, product_id),
CONSTRAINT fk_wishitem_wish FOREIGN KEY (wish_id) REFERENCES wish (id) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=15000000000000000039 DEFAULT CHARSET=utf8

果然,主键ID自增了。

INSERT ... ON DUPLICATE KEY UPDATE不会出现这个问题。

AUTO_INCREMENT

对应表下一个要插入的id

You can retrieve the most recent automatically generated AUTO_INCREMENT value with the LAST_INSERT_ID() SQL function

# 重新设置AUTO_INCREMENT
ALTER TABLE tablename AUTO_INCREMENT = 1

参考资料:

Insert into a MySQL table or update if exists

truncate foreign key constrained table

How to reset AUTO_INCREMENT in MySQL?

MySQL命令2的更多相关文章

  1. Mysql命令大全

    格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...

  2. ****Linux MySQL命令运用个人总结

    1.xampp在linux下如何使用mysql命令 A: 解决方法(推荐第二个方法): 1.xampp中的命令工具在/opt/lampp/bin/目录中,所以可以这样运行mysql命令 /opt/la ...

  3. MySQL命令行登录的例子

    环境:MySQL Sever 5.1 + MySQL命令行工具 问题:MySQL命令行登录 解决: 命令 行登录语法: mysql –u用户名 [–h主机名或者IP地址] –p密码 说明:用户名是你登 ...

  4. MySQL命令行下执行.sql脚本详解

    本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sq ...

  5. Mysql 命令大全

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root - ...

  6. mysql 在windows下,使用 net start mysql 命令发生错误 服务名无效 或 1067

    mysql 在windows下,使用 net start mysql 命令发生错误 :服务名无效 或 1067  先使用mysqld -install安装一下 删除data目录下的日志等文件(因为之前 ...

  7. MySQL命令大全:MySQL常用命令手册、MySQL命令行大全、查询工具

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  8. MYSQL命令行使用指南

    一.连接MYSQL. 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -u ...

  9. mysql命令行以及mysql workbence查询结果中文乱码的解决方法

    最近正在学习mysql,安装环境是windows server 2003 32位操作系统+mysql 5.1.47同时也安装了mysql命令行以及mysql workbench这里是test数据库cr ...

  10. MySQL命令行导出数据库

    MySQL命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server ...

随机推荐

  1. Java并发之显式锁和隐式锁的区别

    Java并发之显式锁和隐式锁的区别 在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchr ...

  2. Python爬虫系列(一):从零开始,安装环境

    在上一个系列,我们学会使用rabbitmq.本来接着是把公司的celery分享出来,但是定睛一看,celery4.0已经不再支持Windows.公司也逐步放弃了服役多年的celery项目.恰好,公司找 ...

  3. python3(三十三)debug

    """ 调试 """ __author__on__ = 'shaozhiqi 2019/9/23' # 调试程序 # . print打印,没 ...

  4. Trie(字典树、前缀树)

    目录 什么是Trie? 创建一棵Trie 向Trie中添加元素 Trie的查询操作 对比二分搜索树和Trie的性能 leetcode上的问题 什么是Trie?   Trie是一个多叉树,Trie专门为 ...

  5. week7_简单题_C_水题_hdu_5578+F_贪心_hdu_5583

      C    HDU_5578 求字符串中所有相同字母的最小距离H. Input 实例个数T然后T行字符串字符串中仅含有小写字母.1≤T≤501≤len≤1000(len为字符串长度) Output ...

  6. Shell 变量引用实例

    初学 Shell 编程时,对变量各种引用使用不太熟悉,走了很多弯路,本文记录变量引用的一些用法,希望对大家有所帮助. 引用 引用指将字符串用引用符号引起来,以防止特殊字符被 shell 脚本解释为其他 ...

  7. 接口测试中实际发生的几个问题——python中token传递

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:AFKplayer PS:如有需要Python学习资料的小伙伴可以加点 ...

  8. 提高万恶的KPI,切忌要避开这六个低效的编程习惯

    作者:程序员小跃 Slogan:当你的才华还无法撑起你的野心时,那应该静下心来好好学习 上次的翻译,引起了很大的反响,大家都想知道自己和高级工程师的差距,看了我的文章,是不是都在默默地做着比较呢?如果 ...

  9. 【Jenkins】插件更改国内源

    最近调试脚本,本机安装了Jenkins,但是安装插件时一直失败.更改升级站点也不生效,究其原因是因为default.json中插件下载地址还https://updates.jenkins.io,升级站 ...

  10. C - Infinite Fence -1260C

    考虑区间长度,我们让r和b除以他们的__gcd这样,这样得到的r和b是互质或者相等的.我们取他们两个小的那个.假设是b.那么被涂的方块应该是b,2b,3b,4b,....kb. 相邻的两个方块之间的区 ...