一、MySQL创建表语法
1.1 创建表
若要在数据库中创建新表,请使用MySQL CREATE TABLE声明。这个CREATE TABLE语句是MySQL中最复杂的语句之一。
##1.1CREATE TABLE声明:
CREATE TABLE [IF NOT EXISTS] table_name (
column_name data_type(length) [NOT NULL] [DEFAULT value] [AUTO_INCREMENT],
PRIMARY KEY (col1,col2,...)
) ENGINE=InnoDB CHARSET=utf8;
让我们更详细地研究一下语法。
-
CREATE TABLE:创建数据表
-
IF NOT EXISTS:是一个可选子句,允许您检查正在创建的表在数据库中是否已经存在。如果是这样的话,MySQL将忽略整个语句,并且不会创建任何新表。 强烈建议您使用IF NOT EXISTS在每一个CREATE TABLE语句,以避免创建已存在的新表时出错。
-
table_name:数据表的名字,表名在数据库中必须是唯一的。
-
column_name:指定列的名称。
-
data_type:数据类型,每一列都有一个特定的数据类型和最大长度,例如,VARCHAR(255)
-
NOT NULL:指示列不允许NULL,在操作数据库时如果输入该字段的数据为NULL ,就会报错。
-
DEFAULT value:用于指定列的默认值。
-
AUTO_INCREMENT:定义列为自增的属性,一般用于主键,数值会自动加1。
-
PRIMARY KEY关键字:用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
-
ENGINE:设置存储引擎,如InnoDB和MyISAM。如果没有显式声明存储引擎,MySQL将默认使用InnoDB。
-
CHARSET 设置编码
-
数据库类型:
1. int:整数类型
* age int,
2. double:小数类型
* score double(5,2)
3. date:日期,只包含年月日,yyyy-MM-dd
4. datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5. timestamp:时间错类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
6. varchar:字符串
name varchar(20):姓名最大20个字符
zhangsan 8个字符 张三 2个字符
具体操作:创建student表包含id,name,birthday,age,insert_time字段 use db3; CREATE TABLE student ( id INT, name VARCHAR(32), birthday DATE,score double(4,1), insert_time timestamp);
1.2 复制表:
语法:
create table 表名 like 被复制的表名;
具体操作:
使用数据库db3新创建一个表格(student1)并把(student)的数据复制给他
use db3;
CREATE TABLE student1 like student ;
二、MySQL序列
2.1创建MySQL序列
在MySQL中,序列是整数按升序生成,即1,2,3…许多应用程序需要序列来生成唯一的编号,例如CRM中的客户ID、HR中的员工号和服务管理系统中的设备编号。
若要自动在MySQL中创建序列,请将AUTO_INCREMENT属性设置为列,该列通常是主键列。
当您使用AUTO_INCREMENT属性:
- 每个表只有一个AUTO_INCREMENT列的数据类型通常为整型.
- AUTO_INCREMENT列必须被索引,这意味着它可以PRIMARYKEY或UNIQUE索引。
- AUTO_INCREMENT列必须具有NOTNULL约束…
- 当您设置AUTO_INCREMENT属性,MySQL将自动添加NOT NULL约束隐式地限制到列。
2.2创建MySQL序列示例
以下陈述创建一个表命名employees它有emp_no列是AUTO_INCREMENT栏:
mysql -u root -p (用户登录)
Enter password:*******(输入密码)
mysql> use testdb;(使用testdb数据库)
Database changed
mysql> CREATE TABLE employees (emp_no INT AUTO_INCREMENT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50));
mysql>show tables; (显示testdb数据库中的表格)
mysql>DESC employees; (显示trunoob_tbl数据表的结构)
2.3MySQL序列是如何工作的
这个AUTO_INCREMENT列具有以下属性:
-
AUTO_INCREMENT列的起始值为1,当插入NULL值到列中,或者当您在INSERT声明。若要获取最后生成的序列号,请使用LAST_INSERT_ID()功能。我们通常对后续语句使用最后一个INSERTID,例如,将数据插入到表中。最后生成的序列在所有会话中都是唯一的。换句话说,如果另一个连接生成序列号,则可以使用LAST_INSERT_ID()功能。
示例演示:
第一步:将两个新行插入到employees表:mysql>INSERT INTO employees(first_name,last_name)VALUES(‘John’,‘Doe’),(‘Mary’,‘Jane’);
第二步,查询employees表:SELECT * FROM employees;
第三步:删除表中数据emp_no=2的列:
DELETE FROM employees WHERE emp_no = 2;
SELECT * FROM employees;
-
如果你将新行插入表中并且为序列指定一个值,如果序列号在列中不存在,MySQL将插入序列号,如果序列号已经存在,则发出错误。如果插入一个大于下一个序列号的新值,MySQL将使用新值作为起始序列号,并为下一次使用生成一个大于当前序列号的唯一序列号。这在顺序上造成了空白。
-
如果您使用UPDATE语句更新AUTO_INCREMENT列到已经存在的值时,如果列具有唯一索引,MySQL将发出一个重复键错误。
-
如果您更新AUTO_INCREMENT列的值大于列中的现有值,MySQL将为下一行使用上一次插入序列号的下一个编号。例如,如果最后一次插入序列号为3,则将其更新为10,新行的序列号为4。
-
如果您使用DELETE语句来删除最后插入的行,MySQL可能会也可能不会重用已删除的序列号,这取决于存储引擎在桌子上。如果删除一行,则MyISAM表不会重用已删除的序列号-例如,表中的最后一个INSERTid为10,如果删除它,MySQL仍然为新行生成下一个序列号,即11。与MyISAM表类似,InnoDB表在删除行时不重用序列号。一旦您设置了AUTO_INCREMENT属性,则可以重置自动增量值,例如,通过使用ALTER TABLE声明。
示例演示:
第四步:插入一名新雇员:INSERT INTO employees(first_name,last_name)VALUES('Jack','Lee'); SELECT * FROM employees;
employees表的存储引擎是InnoDB,它不重用已删除的序列号。新行emp_no =3.
第五步:用emp_no3至1:
UPDATE employees SET first_name = 'Joe',emp_no = 1WHERE emp_no = 3;(MySQL发出了主键重复输入的错误。)
UPDATE employees SET first_name = 'Joe',emp_no = 10WHERE emp_no = 3;
SELECT * FROM employees;
第六步:在将序列号更新为10之后插入一名新员工:
INSERT INTO employees(first_name,last_name) VALUES('Wang','Lee');
SELECT * FROM employees;
最后一次插入的下一个序列号是11号,因此MySQL对新行使用数字11而不是4。
三、通过命令提示符创建表
通过 mysql> 命令窗口可以很简单的创建MySQL数据表。你可以使用 SQL 语句 CREATE TABLE 来创建数据表。
3.1示例演示1:
以下为创建数据表 runoob_tbl 实例:
mysql -u root -p (用户登录)
Enter password:*******(输入密码)
mysql> use testdb;(使用testdb数据库)
Database changed
mysql> CREATE TABLE runoob_tbl( (创建数据库)
-> runoob_id INT NOT NULL AUTO_INCREMENT,
-> runoob_title VARCHAR(100) NOT NULL,
-> runoob_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( runoob_id )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql>show tables; (显示testdb数据库中的表格)
mysql>DESC runoob_tbl; (显示trunoob_tbl数据表的结构)
mysql>exit; (退出)
注意:MySQL命令终止符为分号 ; 。
注意: -> 是换行符标识,不要复制。
3.1示例演示2:
下面的语句创建一个名为tasks:
mysql -u root -p (用户登录)
Enter password:*******(输入密码)
mysql> use testdb;(使用testdb数据库)
Database changed
mysql> CREATE TABLE IF NOT EXISTS tasks ( (创建数据库)
-> task_id INT AUTO_INCREMENT,
->title VARCHAR(255) NOT NULL,
-> start_date DATE,
-> due_date DATE,
-> status TINYINT NOT NULL,
-> priority TINYINT NOT NULL,
->description TEXT,
-> PRIMARY KEY ( task_id)
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql>show tables; (显示testdb数据库中的表格)
mysql>DESC tasks; (显示trunoob_tbl数据表的结构)
mysql>exit; (退出)
注意:MySQL命令终止符为分号 ; 。
注意: -> 是换行符标识,不要复制。
任务表有以下列:
- task_id:是自动增量列。如果您使用INSERT语句将一个新行添加到表中,而不指定Task_id列的值,Task_id列将接受以1开头的自动生成的整数。这个task_id是主键列。
- title列:是最大长度为255的变量字符串列。这意味着不能将长度大于255的字符串插入到该列中。这个NOT NULL指示列必须具有值。换句话说,当您插入或更新这个专栏。
- start_date和due_date:是接受NULL的日期列。
- status和priority:是TINYINT不允许空的列。
- description列:是TEXT列接受空。
四、使用PHP脚本创建数据表
你可以使用 PHP 的 mysqli_query() 函数来创建已存在数据库的数据表。
该函数有两个参数,在执行成功时返回 TRUE,否则返回 FALSE。
4.1语法
mysqli_query(connection,query,resultmode);
参数描述:
- connection 必需。规定要使用的 MySQL 连接。
- query 必需,规定查询字符串。
- resultmode 可选。一个常量。可以是下列值中的任意一个:(MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认))
4.2演示实例
以下实例使用了PHP脚本来创建数据表:
创建数据表
<?php
$dbhost = 'localhost:3306'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
echo '连接成功<br />';
$sql = "CREATE TABLE runoob_tbl( ".
"runoob_id INT NOT NULL AUTO_INCREMENT, ".
"runoob_title VARCHAR(100) NOT NULL, ".
"runoob_author VARCHAR(40) NOT NULL, ".
"submission_date DATE, ".
"PRIMARY KEY ( runoob_id ))ENGINE=InnoDB DEFAULT CHARSET=utf8; ";
mysqli_select_db( $conn, 'testdb' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('数据表创建失败: ' . mysqli_error($conn));
}
echo "数据表创建成功\n";
mysqli_close($conn);
?>
执行成功后,就可以通过命令行查看表结构:
mysql> use testdb;(使用testdb数据库)
Database changed
mysql>show tables; (显示testdb数据库中的表格)
mysql>DESC runoob_tbl; (显示trunoob_tbl数据表的结构)
mysql>exit; (退出)