主键使用
主键的使用
CREATE TABLE t17 (id INT PRIMARY KEY ,`name` VARCHAR(32), email VARCHAR(32));
主键列的值不可以重复
INSERT INTO t17 VALUES(1,'jack','jack@sohu.com');
INSERT INTO t17 VALUES(2,'tom','tom@sohu.com');
INSERT INTO t17 VALUES(1,'hsp','hsp@sohu.com');
SELECT * FROM t17 1.primary key是主键,一个表只能有一个主键,
CREATE TABLE t18( id INT, `name` VARCHAR(32),email VARCHAR(32),
PRIMARY KEY (id,`name`) );这里就是复合主键
INSERT INTO t18 VALUES(1,'tom','tom@sohu.com');
INSERT INTO t18 VALUES(1,'jack','jack@sohu.com');
SELECT *FROM t18;复合主键要求id和name组件同时相同才报错
DESC t18;
unique使用
CREATE TABLE t19 (id INT UNIQUE ,`name` VARCHAR(32), email VARCHAR(32));
演示unique的使用,此时id列也是不可以重复的
INSERT INTO t19 VALUES(1,'jack','jack@sohu.com');
INSERT INTO t19 VALUES(2,'tom','tom@sohu.com');
INSERT INTO t19 VALUES(1,'hsp','hsp@sohu.com');
SELECT*FROM t19;
unique如果没有指定not null,则unique字段可以有多个null
如果一个列加上unique not null使用效果和primary key是一样的
一张表也是可以有多个unique字段的
INSERT INTO t19 VALUES(NULL,'tom','tom@sohu.com');
外键
外建演示
创建主表foreign key(外键)
CREATE TABLE my_class( id INT PRIMARY KEY ,
`name` VARCHAR(32) NOT NULL DEFAULT '');
CREATE TABLE my_stu (id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '',
class_id INT, FOREIGN KEY( class_id) REFERENCES my_class(id))
INSERT INTO my_class VALUES(100,'java'),(200,'web');
SELECT *FROM my_class;
INSERT INTO my_stu VALUES(1,'tom',100),(2,'jack',200);
SELECT *FROM my_stu;
INSERT INTO my_stu VALUES(3,'hsp',300);由于外建约束插入会失败
表的类型是innodb才支持外建
表设计练习
CREATE DATABASE shop_db;
CREATE TABLE good( goods_id INT PRIMARY KEY,
goods_name VARCHAR(64) NOT NULL DEFAULT '',
unitprice DECIMAL(10,2) NOT NULL DEFAULT 0 CHECK (unitprice
>=1.0 AND unitprice<=9999.99),category INT NOT NULL DEFAULT 0,
provider VARCHAR(64) NOT NULL DEFAULT '');
CREATE TABLE customer(customer_id CHAR(8) PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT '',address VARCHAR(64) NOT NULL DEFAULT '',email VARCHAR(64) UNIQUE NOT NULL,
sex ENUM('男','女') NOT NULL, -- 这里使用枚举,要么男要么女
card_id CHAR(18));
CREATE TABLE purchase(order_id INT UNSIGNED PRIMARY KEY,
customer_id CHAR(8) NOT NULL DEFAULT '',
goods_id INT NOT NULL DEFAULT 0,nums INT NOT DEFAULT 0,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES good(goods_id));
DESC good;
DESC customer;
DESC purchase;
演示自增长的使用
演示自增长使用
CREATE TABLE t24(id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(32) NOT NULL DEFAULT '',`name` VARCHAR(32)
NOT NULL DEFAULT '');
DESC t24;
INSERT INTO t24 VALUES(null,'jack@qq.com','jack');
INSERT INTO t24(email,`name`) VALUES('hsp@sohu.com','hsp');
SELECT *FROM t24
自增长默认从一开始,你也可以通过命令修改自增长初始值
ALTER TABLE t24 AUTO_INCREMENT=100;
INSERT INTO t24 VALUES(666,'sa','sda');
索引的效果
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT ""
) ;
#创建表EMP雇员
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
) ;
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2) NOT NULL,
hisal DECIMAL(17,2) NOT NULL
);
#测试数据
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
delimiter $$
#创建一个函数,名字 rand_string,可以随机返回我指定的个数字符串
create function rand_string(n INT)
returns varchar(255) #该函数会返回一个字符串
begin
#定义了一个变量 chars_str, 类型 varchar(100)
#默认给 chars_str 初始值 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'
declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n do
# concat 函数 : 连接函数mysql函数
set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));
set i = i + 1;
end while;
return return_str;
end $$
#这里我们又自定了一个函数,返回一个随机的部门号
create function rand_num( )
returns int(5)
begin
declare i int default 0;
set i = floor(10+rand()*500);
return i;
end $$
#创建一个存储过程, 可以添加雇员
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
#set autocommit =0 把autocommit设置成0
#autocommit = 0 含义: 不要自动提交
set autocommit = 0; #默认不提交sql语句
repeat
set i = i + 1;
#通过前面写的函数随机产生字符串和部门编号,然后加入到emp表
insert into emp values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
#commit整体提交所有sql语句,提高效率
commit;
end $$
#添加8000000数据
call insert_emp(100001,8000000)$$
#命令结束符,再重新设置为;
delimiter ;
SELECT COUNT(*) FROM emp;
没有索引时,查询记录
SELECT * FROM emp WHERE emptno=1234567
现在体验索引优化,没有创建索引文件大小是524m
empno_index是索引名字,对emp表的empno列进行索引
CREATE INDEX empno_index ON emp(empno)
索引本身会占用空间
索引的使用
演示mysql索引的使用
CREATE TABLE t25( id INT,`name` VARCHAR(32));
SHOW INDEXES FROM T25;查找表是否有索引,接下来添加索引
CREATE UNIQUE INDEX id_index ON t25 (id);添加唯一索引
CREATE INDEX id_index ON t25(id);添加普通索引,也可如下写
ALTER TABLE t25 ADD INDEX id_index(id)
CREATE TABLE t26( id INT,`name` VARCHAR(32));创建主键索引
ALTER TABLE t26 ADD PRIMARY KEY(id)
SHOW INDEX FROM t26
DROP INDEX id_index ON t25删除索引,也可写为
ALTER TABLE t26 DROP PRIMARY KEY删除主键索引
SHOW KEYS FROM t25查询索引
事务处理
CREATE TABLE t27(id INT ,`name` VARCHAR(32));创建测试表
START TRANSACTION开始事务
SAVEPOINT a;设置保存点a
INSERT INTO t27 VALUES(100,'tom');
SELECT *FROM t27;
SAVEPOINT b;
INSERT INTO t27 VALUES(200,'tom');
ROLLBACK TO b;回退到b
ROLLBACK TO a;继续回退到a
COMMIT是提交事务,一旦提交就无法回退
如果开始一个事务没有设置保存点你可以执行rollback,默认回到事务开始的状态