MySQLブラシ問題-牛客網Day 7~8

15750 ワード

データを一括挿入し、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')))

通常の操作を覚えておいてください.sqlite 3であれば、
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);

通常の操作を覚えておいてください.sqlite 3であれば、
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
2通りの書き方をする
RENAME TABLE titles_2017 TO titles_test
ALTER TABLE titles_test RENAME TO titles_2017