MySQL刷题-牛客网 Day7~8

批量插入数据,不使用replace操作

对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作

CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))

记一下常规操作,
如果是sqlite3 ,

INSERT OR IGNORE INTO actor
VALUES ('3',
        'ED',
        'CHASE',
        '2006-02-15 12:34:33')

如果是mysql ,

INSERT IGNORE INTO actor
VALUES ('3',
        'ED',
        'CHASE',
        '2006-02-15 12:34:33')

对first_name创建唯一索引uniq_idx_firstname

针对如下表actor结构创建索引:

CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))

对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname

没见过这种题,写下解法

CREATE UNIQUE INDEX uniq_idx_firstname ON actor(first_name);
CREATE INDEX idx_lastname ON actor(last_name);

针对上面的salaries表emp_no字段创建索引idx_emp_no

针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引。

CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
create index idx_emp_no on salaries(emp_no);

记一下常规操作,
如果是sqlite3 ,

SELECT * 
FROM salaries INDEXED BY idx_emp_no 
WHERE emp_no = '10005'

如果是mysql ,

SELECT * 
FROM salaries FORCE INDEX idx_emp_no 
WHERE emp_no = '10005'

下面简单介绍一下触发器的概念。
触发器是MySQL响应以下任意语句(DELETE、INSERT、UPDATE)而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句)。


删除emp_no重复的记录,只保留最小的id对应的记录。

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

insert into titles_test values ('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');

本题运用逆向思维将迎刃而解,找出需要留下的记录,删除其他即可。

DELETE FROM titles_test
WHERE id NOT IN (SELECT MIN(id)
                 FROM titles_test
                 GROUP BY emp_no)

将titles_test表名修改为titles_2017

给出两种写法

RENAME TABLE titles_2017 TO titles_test
ALTER TABLE titles_test RENAME TO titles_2017
发布了24 篇原创文章 · 获赞 0 · 访问量 318

猜你喜欢

转载自blog.csdn.net/Helslie/article/details/104512215