MySQL 基础(1-7)

1. 管理数据库

创建数据库: CREATE DATABASE [IF NOT EXISTS] database_name;

ex. CREATE DATABASE  IF NOT EXISTS testdb; 

ex. CREATE DATABASE testdb;

展示数据库:SHOW DATABASES;

连接到某一数据库:USE database_name;

删除数据库:DROP DATABASE [IF EXISTS] database_name;

CREATE DATABASE IF NOT EXISTS test_database;
SHOW DATABASES;
DROP DATABASE IF EXISTS test_database;

2. MySQL支持的表类型

MyISAM  

5.5以前是MySQL默认表类型,大小能够达到256TB,兼容多平台;

InnoDB    从5.5.开始做为MySQL默认表类型,大小能够达到64TB,支持外键、提交、回滚和前滚的操作,兼容多平台;
MERGE    虚拟表,有多个MyISAM表,没有自己的索引,提高连接多表时的性能, 只能执行SELECT, DELETE, UPDATE 和 INSERT,若执行DROP,只删掉MERGE,下面的表仍然存在;
MEMORY (HEAP)    存在于内存中,hash索引,因此读取速度比MyISAM快,生命周期与数据库服务器起着的时间相关;
ARCHIVE 可存储大量数据,并压缩以节省硬盘空间,insert时压缩,读取时解压, 只执行INSERT 和 SELECT,无索引,读取时全表搜索;
CSV   逗号分隔值文件,能够将数据移植到非SQL应用,比如电子表格,不支持NULL,读取时全表搜索;
FEDERATED  能够远程管理MySQL服务器中的数据,而不需要集群和复制技术,本地FEDERATED表无数据,读取时从远程FEDERATED表提取数据。

ex. create table Employee(id int(3) primary key auto_increment,name varchar(20),age int, salary int, sex char)Engine MYISAM;

3. MySQL数据类型

数值:

TypeSize
TINYINT 
SMALLINT 
MEDIUMINT 
INT 
BIGINT 
DECIMAL 
FLOAT 
DOUBLE 
BIT  

字符:

CHARA fixed-length non-binary (character) string 【ex. sex CHAR(1),固定长度】
VARCHAR A variable-length non-binary string【ex. name VARCHAR(20) , 变长】
BINARY A fixed-length binary string
VARBINARY A variable-length binary string
TINYBLOB A very small BLOB (binary large object)
BLOB A small BLOB
MEDIUMBLOB A medium-sized BLOB
LONGBLOB A large BLOB
TINYTEXT A very small non-binary string
TEXT A small non-binary string
MEDIUMTEXT A medium-sized non-binary string
LONGTEXT A large non-binary string
ENUM An enumeration; each column value may be assigned one enumeration member
SET A set; each column value may be assigned zero or more set members

时间:

DATEA date value in ‘CCYY-MM-DD’ format 【日期】
TIME A time value in ‘hh:mm:ss’ format
DATETIME A date and time value in ‘CCYY-MM-DD hh:mm:ss’ format
TIMESTAMP A timestamp value in ‘CCYY-MM-DD hh:mm:ss’ format
YEAR A year value in CCYY or YY format

空间:

GEOMETRYA spatial value of any type 任何形式的空间值
POINT A point (a pair of X Y coordinates) 【点,0维】
LINESTRING A curve (one or more POINT values) 【线,1维】
POLYGON A polygon 【面,2维】
GEOMETRYCOLLECTION A collection of GEOMETRY values
MULTILINESTRING A collection of LINESTRING values
MULTIPOINT A collection of POINT values
MULTIPOLYGON A collection of POLYGON values

4. MySQL建表

建表语句:

CREATE TABLE [IF NOT EXISTS] table_name(
        column_list
        ) engine=table_type;

if not exists table_name:当表不存在时,建表,防止在表已存在的情况下,建新表;

column_list:以逗号分隔

engine:选择存储引擎,InnoDB(default), MyISAM, HEAP, EXAMPLE, CSV, ARCHIVE, MERGE FEDERATED 以及 NDBCLUSTER。

列:

column_name data_type[size] [NOT NULL|NULL] [DEFAULT value] [AUTO_INCREMENT]

列名 Not NULL | NULL:该列是否接受NULL Default Value:该列默认值;Auto_Increment:当新增一行时,该列值增1;每个表只能有一个auto_increment;

例子

CREATE TABLE IF NOT EXISTS tasks (
  task_id int(11) NOT NULL AUTO_INCREMENT,
  subject varchar(45) DEFAULT NULL,
  start_date DATE DEFAULT NULL,
  end_date DATE DEFAULT NULL,
  description varchar(200) DEFAULT NULL,
  PRIMARY KEY (task_id)  #设置主键,主键:not null 且 unique,一个表只能有一个主键,主键不能索引;
) ENGINE=InnoDB; #设置表类型

另一种添加主键的方法:ALTER TABLE tasks ADD PRIMARY KEY (task_id); #更新表结构时,加上主键;

结果:

Tasks Table

5. MySQL设置自增长序列

To create a sequence in MySQL automatically, you set the AUTO_INCREMENT attribute to a column, which typically is primary key column.

在MySQL中建立一个自增长序列,将一列设置AUTO_INCREMENT,该列通常是主键;

使用AUTO_INCREMENT规则:

  • 每个表只有一个AUTO_INCREMENT,其值通常为int或者float;
  • 该列必须为索引,也就是主键或者唯一索引(unique);
  • 该列必须Not NULL;

CREATE TABLE employees(
 emp_no INT(4) AUTO_INCREMENT PRIMARY KEY,
 first_name VARCHAR(50),
 last_name  VARCHAR(50)
)ENGINE = INNODB;
Auto_increment列属性:

  • 列开始值为1;
  • 使用函数LAST_INSERT_ID()获得最后一个生成的自增长序列号;
  • 插入新行并为自增序列赋值时,若值已存在,会产生错误,如果定义一个比Last_Insert更大的值,下一个自增序列值将比当前值大,序列值之间产生跨越;
  • 通过update更新序列值,若值存在,产生duplicate-key error,若当前为3,更新为10,下一个值将从4开始;
  • 如果删掉其中一行,MyISAM表不会重用已用过删掉的数值,InnoDB会重用;

INSERT INTO employees(first_name,last_name)
VALUES('Jane','Doe'),
      ('Mary','July');
UPDATE Employee
SET first_name = 'Jane',
    emp_no = 1
WHERE emp_no = 2;
6. MySQL主键

  • 唯一;
  • Not Null;
  • 每个表仅有一个主键;

MySQL对Int类型工作的更快;主键一般为INT,BIGINT,如果是TINYINT或SMALLINT,保证数据行数不超出主键范围;
方法一:

CREATE TABLE users(
   user_id INT AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(40),
   password VARCHAR(255),
   email VARCHAR(255)
);

方法二:

CREATE TABLE roles(
   role_id INT AUTO_INCREMENT,
   role_name VARCHAR(50),
   PRIMARY KEY(role_id)
);

如果主键有多列:

CREATE TABLE userroles(
   user_id INT NOT NULL,
   role_id INT NOT NULL,
   PRIMARY KEY(user_id,role_id),
   FOREIGN KEY(user_id) REFERENCES users(user_id),
   FOREIGN KEY(role_id) REFERENCES roles(role_id)
);

用Alter添加主键:

ALTER TABLE table_name
ADD PRIMARY KEY(primary_key_column);

PRIMARY KEY vs. UNIQUE KEY vs. KEY

KEY为Index的同义词,用于建立新的index;

UNIQUE,该列值必须是唯一的,允许NULL,一个表可以有多个;

ALTER TABLE users
ADD UNIQUE INDEX username_unique (username ASC) ;

7. MySQL外键

MySQL Foreign Key - Customers & Orders Tables

CustomerNumber为Orders的外键,Customer表为父表或者referenced table, orders表为子表或者referencing table.

外键还能够在同一个表中创建。

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
constraint:定义,约束名和外键约束条件;

foreign key:可定义外键名,或由MySQL生成,column在子表中;

references:父表以及对应列;注:column在父表和子表中的数量一致。

On delete action:在父表中删除在子表中有记录的外键,mysql将根据action决定是否拒绝这一操作;

 ON DELETE CASCADE:父表中记录被删除,子表中的记录也会相对被删除;

ON DELETE SET NULL:父表记录删除,子表记录被设为Null,前提是子表该列接受Null值;

ON DELETE NO ACTION / ON DELETE RESTRICT:MySQL拒绝删除;

On update:当父表数据被更改时,子表的结果;

ON UPDATE CASCADE:允许交叉列表的子表对应行更新;

ON UPDATE SET NULL:父表记录被更新,子表值设为null;

其他,更新被拒绝。

例子,创建表products时添加外键:

CREATE DATABASE IF NOT EXISTS dbdemo;
 
USE dbdemo;
 
CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;
 
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON DELETE RESTRICT
   ON UPDATE CASCADE
)ENGINE=InnoDB;

表已创建,添加外键的语法:

ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

创建新表vendors,并在表products中加入一列vdr_id:

USE dbdemo;
 
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;

在表products中添加外键:

ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;
现在表products中有两个外键。

删除外键语法:

ALTER TABLE table_name 
DROP FOREIGN KEY constraint_name

查看constraint_name:

SHOW CREATE TABLE table_name
禁止外键检查:

SET foreign_key_checks = 0

参考:

MySQL Tutorial:http://www.mysqltutorial.org/

浅谈MySQL主键:http://www.cnblogs.com/mydomain/archive/2012/08/26/2657182.html

mysql中key 、primary key 、unique key 与index区别:http://zccst.iteye.com/blog/1697043

空间数据:http://www.cnblogs.com/marsprj/archive/2013/02/08/2909452.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值