SQL进阶之约束、索引

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS SQL Server,基础系列 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 本实验带您学习SQL约束、索引、ALTER TABLE语句和AUTO INCREMENT字段的使用方法。

SQL进阶之约束、索引

1.  创建实验资源

开始实验之前,您需要先创建实验相关资源。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、用户信息等)。

说明:资源创建过程需要3~5分钟。

2.  连接数据库并查看数据库

本步骤指导您如何连接ECS实例上的MySQL数据库,并查看实验所使用的数据库。

  1. 执行如下命令,登录数据库。
mysql -uroot -p
  1. 输入root用户登录密码,密码为Test123!

  1. 返回结果如下,表示登录成功。

  1. 执行如下SQL语句,查看所有的数据库。
show databases;

返回结果如下,您可查看到MySQL数据库中有五个数据库,其中Test数据库是实验室提前创建好的,后续实验所有操作都在Test数据库中执行。

  1. 执行如下SQL语句,选择数据库Test。
use Test;

3.  什么是SQL约束?

SQL约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。约束可以在创建表时规定(通过CREATE TABLE语句),或者在表创建之后规定(通过ALTER TABLE语句)。

说明:本章节主要讲解什么是SQL约束和有哪些约束,不需要您进行实践操作,在下面的章节,我们会详细讲解每一种约束,并带您实践体验SQL的各种约束。

  • SQL的CREATE TABLE+CONSTRAINT语法。
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
  • 在SQL中,我们有如下约束:
  • NOT NULL:指示某列不能存储NULL值。
  • UNIQUE:保证某列的每行必须有唯一的值。
  • PRIMARY KEY:NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY:保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK:保证列中的值符合指定的条件。
  • DEFAULT:规定没有给列赋值时的默认值。

4.  NOT NULL约束

在默认的情况下,表的列接受NULL值。NOT NULL约束强制列不接受NULL值。NOT NULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

  • NOT NULL约束的示例:

执行如下SQL语句,在创建表Persons时强制ID列、LastName列和FirstName列不接受NULL值。

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Age int
);

  • 添加NOT NULL约束的示例。

执行如下SQL语句,在一个已创建的Persons表的Age字段中添加NOT NULL约束。

ALTER TABLE Persons
MODIFY Age int NOT NULL;

  • 删除NOT NULL约束的示例。

执行如下SQL语句,在一个已创建的Persons表的Age字段中删除NOT NULL约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

ALTER TABLE Persons
MODIFY Age int NULL;
DROP TABLE Persons;

5.  UNIQUE约束

UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARY  KEY约束均为列或列集合提供了唯一性的保证。PRIMARY  KEY约束拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束。

  • UNIQUE和PRIMARY KEY的区别:
  • UNIQUE(唯一约束)和PRIMARY KEY(主键)非常相似,但是UNIQUE允许字段中出现一次NULL值,而PRIMARY KEY不允许出现 NULL 值,因为可以认为:
PRIMARY KEY = UNIQUE +  NOT NULL
  • 一张表可以包含多个UNIQUE字段,但是只能有一个主键。
  • CREATE TABLE时的UNIQUE约束示例:
  • 在Mysql环境中:

执行如下SQL语句,创建Persons表时在P_Id列上创建UNIQUE约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
);
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的UNIQUE约束示例只需阅读学习。

CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
  • 如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法。

执行如下SQL语句,创建表Persons时在P_Id列和LastName列上创建UNIQUE约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
);
DROP TABLE Persons;

  • ALTER TABLE时的UNIQUE约束的示例:
  • 当表已被创建时,在Persons表的P_Id列创建UNIQUE约束。

执行如下SQL语句,先创建Persons表,然后在Persons表的P_Id列创建UNIQUE约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD UNIQUE (P_Id);
DROP TABLE Persons;

  • 当表已被创建时,如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法。

执行如下SQL语句,先创建Persons表,然后在Persons表的P_Id列和LastName列创建UNIQUE约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName);

  • 撤销UNIQUE约束的示例:
  • 在Mysql环境中:

执行如下SQL语句,撤销UNIQUE约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

ALTER TABLE Persons
DROP INDEX uc_PersonID;
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的撤销UNIQUE约束示例只需阅读学习。

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID;

6.  PRIMARY KEY约束

PRIMARY KEY约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含NULL值。每个表都应该有一个主键,并且每个表只能有一个主键。

  • CREATE TABLE时的PRIMARY KEY约束的示例:
  • 在Mysql环境中:

执行如下SQL语句,在Persons表创建时在P_Id列上创建PRIMARY KEY约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的PRIMARY KEY约束示例只需阅读学习。

CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
  • 如需命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面的SQL语法。

执行如下SQL语句,创建表Persons时在P_Id列和LastName列上创建PRIMARY KEY约束。

说明:在下方的示例中,只有一个主键PRIMARY KEY(pk_PersonID)。然而,pk_PersonID的值是由两个列(P_Id和LastName)组成的。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);
DROP TABLE Persons;

  • ALTER TABLE时的SQL PRIMARY KEY约束的示例:
  • 当表已被创建时,在表Persons的LastName列创建PRIMARY KEY约束。

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列创建PRIMARY KEY约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id);
DROP TABLE Persons;

  • 当表已被创建时,如需命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面的SQL语法。

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列和LastName列创建PRIMARY KEY约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName);

  • 撤销PRIMARY KEY约束的示例:
  • 在Mysql环境中:

执行如下SQL语句,撤销PRIMARY KEY约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

ALTER TABLE Persons
DROP PRIMARY KEY;
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的撤销PRIMARY KEY约束示例只需阅读学习。

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID;

7.  FOREIGN KEY约束

一个表中的FOREIGN KEY指向另一个表中的UNIQUE KEY(唯一约束的键)。

  • FOREIGN KEY约束的原理:

假如我们有如下图两张表,Orders表中的P_Id列指向Persons表中的P_Id列。Persons表中的P_Id列是Persons表中的PRIMARY  KEY。Orders表中的P_Id列是Orders表中的FOREIGN KEY。FOREIGN  KEY约束用于预防破坏表之间连接的行为。FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

Persons表

Orders表

  • CREATE TABLE时的FOREIGN KEY约束的示例:
  • 在Mysql环境中:

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列和LastName列创建PRIMARY  KEY约束。然后创建Orders表时在P_Id列上创建FOREIGN KEY约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
);
DROP TABLE Orders;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的FOREIGN KEY约束示例只需阅读学习。

CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
);
  • 如需命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法。

执行如下SQL语句,创建表Orders时在P_Id列上创建FOREIGN KEY约束。

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
);
DROP TABLE Orders;

  • ALTER TABLE 时的FOREIGN KEY约束的示例:
  • 当Orders表已被创建时,如需在P_Id列创建FOREIGN KEY约束,请使用下面的 SQL。

执行如下SQL语句,先创建Orders表,然后在表Orders的P_Id列创建FOREIGN KEY约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id)
);
  ALTER TABLE Orders
  ADD FOREIGN KEY (P_Id)
  REFERENCES Persons(P_Id);
DROP TABLE Orders;

  • 如需命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法。

执行如下SQL语句,先创建Orders表,然后在表Orders的P_Id列创建FOREIGN KEY约束。

CREATE TABLE Orders
  (
  O_Id int NOT NULL,
  OrderNo int NOT NULL,
  P_Id int,
  PRIMARY KEY (O_Id)
  );
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id);

  • 撤销FOREIGN KEY约束的示例:
  • 在Mysql环境中:

执行如下SQL语句,撤销FOREIGN KEY约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders;
DROP TABLE Orders;
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的撤销FOREIGN KEY约束示例只需阅读学习。

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders;

8.  CHECK约束

CHECK约束用于限制列中的值的范围。如果对单个列定义CHECK约束,那么该列只允许特定的值。如果对一个表定义CHECK约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。

  • CREATE TABLE时的CHECK约束:
  • 在Mysql环境中:

执行如下SQL语句,在Persons表创建时在P_Id列上创建CHECK约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
);
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的CHECK约束示例只需阅读学习。

CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
  • 如需命名CHECK约束,并定义多个列的CHECK约束,请使用下面的SQL语法。

执行如下SQL语句,创建表Persons时在P_Id列和City列上创建CHECK约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
);
DROP TABLE Persons;

  • ALTER TABLE时的SQL CHECK约束:
  • 当表已被创建时,在表Persons的在P_Id列创建CHECK约束,请使用下面的SQL。

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列创建CHECK约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD CHECK (P_Id>0);
DROP TABLE Persons;

  • 如需命名CHECK约束,并定义多个列的CHECK约束,请使用下面的SQL语法。

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列和City列创建CHECK约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes');

  • 撤销CHECK约束:
  • 在Mysql环境中:

执行如下SQL语句,撤销CHECK约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

ALTER TABLE Persons
DROP CHECK chk_Person;
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/Oracle/MS Access环境中的撤销CHECK约束示例只需阅读学习。

ALTER TABLE Persons
DROP CONSTRAINT chk_Person;

9.  DEFAULT约束

DEFAULT约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。

  • CREATE TABLE时的DEFAULT约束的示例:
  • 执行如下SQL语句,在Persons表创建时在City列上创建DEFAULT约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
);
DROP TABLE Persons;

  • 通过使用类似NOW()这样的函数,DEFAULT约束也可以用于插入系统值。

执行如下SQL语句,在Orders表创建时在OrderDate列上创建DEFAULT约束并使用GETDATE()函数插入系统值。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate TIMESTAMP DEFAULT NOW()
);
DROP TABLE Orders;

  • ALTER TABLE时的DEFAULT约束的示例:
  • 在Mysql环境中:

执行如下SQL语句,先创建Persons表,然后在表Persons的City列创建DEFAULT约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES';

  • 在SQL Server/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/MS Access环境中的ALTER TABLE时的DEFAULT约束示例只需阅读学习。

ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES';
  • 在Oracle环境中:

说明:本实验资源环境安装Mysql,在SQL Server/MS Access环境中的ALTER TABLE时的DEFAULT约束示例只需阅读学习。

ALTER TABLE Persons
MODIFY City DEFAULT 'SANDNES';
  • 撤销DEFAULT约束的示例。
  • 在Mysql环境中:

执行如下SQL语句,撤销DEFAULT约束。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

ALTER TABLE Persons
ALTER City DROP DEFAULT;
DROP TABLE Persons;

  • 在SQL Server/Oracle/MS Access环境中:

说明:本实验资源环境安装Mysql,在SQL Server/MS Access环境中的撤销DEFAULT约束示例只需阅读学习。

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;

10.  CREATE INDEX语句

CREATE INDEX 语句用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

您可以在表中创建索引,以便更加快速高效地查询数据。用户无法看到索引,它们只能被用来加速搜索/查询。

说明:

  • 更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅在常被搜索的列(以及表)上面创建索引。
  • 用于创建索引的语法在不同的数据库中不一样。因此,检查您的数据库中创建索引的语法。
  • CREATE INDEX的语法:

在表上创建一个简单的索引,允许使用重复的值。

CREATE INDEX index_name
ON table_name (column_name);
  • CREATE UNIQUE INDEX的语法:

在表上创建一个唯一的索引,不允许使用重复的值。唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX index_name
ON table_name (column_name);
  • CREATE INDEX的示例:

执行如下语句,先创建Persons表,然后在Persons表的LastName列上创建一个名为PIndex的索引。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
CREATE INDEX PIndex
ON Persons (LastName);
DROP TABLE Persons;

  • 如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开。

执行如下语句,先创建Persons表,然后在Persons表的LastName列上创建一个名为PIndex的索引。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
CREATE INDEX PIndex
ON Persons (LastName, FirstName);
DROP TABLE Persons;

11.  撤销索引、撤销表以及撤销数据库

通过使用DROP语句,可以轻松地删除索引、表和数据库。

说明:本章节主要讲解撤销索引、撤销表以及撤销数据库的语法,不需要您进行实践操作。

  • DROP INDEX语句:

DROP INDEX语句用于删除表中的索引。

  • 用于MS Access的DROP INDEX语法。
DROP INDEX index_name ON table_name;
  • 用于MS SQL Server的DROP INDEX语法。
DROP INDEX table_name.index_name;
  • 用于DB2/Oracle的DROP INDEX语法。
DROP INDEX index_name;
  • 用于MySQL的DROP INDEX语法。
DROP INDEX index_name;
  • DROP TABLE语句:

DROP TABLE语句用于删除表。

DROP DATABASE database_name;
  • DROP DATABASE语句:

DROP DATABASE语句用于删除数据库。

DROP DATABASE database_name;
  • TRUNCATE TABLE 语句:

TRUNCATE TABLE语句用于仅需要删除表内的数据,但并不删除表本身。

TRUNCATE TABLE table_name;

12.  ALTER TABLE语句

  • ALTER TABLE语句用于在已有的表中添加、删除或修改列。
  • ALTER TABLE语法:
  • 在表中添加列。
ALTER TABLE table_name
ADD column_name datatype;
  • 删除表中的列。

注意:某些数据库系统不允许这种在数据库表中删除列的方式。

ALTER TABLE table_name
DROP COLUMN column_name;
  • 改变表中列的数据类型。
  • 在MySQL/Oracle环境中:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
  • SQL Server/MS Access环境中:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
  • ALTER TABLE示例:
  • ALTER TABLE添加列的示例。

执行如下SQL语句,先创建Persons表,插入三条数据,然后在Persons表添加一个名为 DateOfBirth的列。DateOfBirth列的类型是date,可以存放日期。我们现在查看Persons表,可以看到新增的DateOfBirth列。

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
INSERT INTO Persons VALUES ('1', 'Hansen', 'Ola','Timoteivn 10','Sandnes'), ('2', 'Svendson', 'Tove','Borgvn 23','Sandnes'), ('3', 'Pettersen', 'Kari','Storgt 20','Stavanger');
ALTER TABLE Persons
ADD DateOfBirth date;
SELECT * FROM Persons;

  • ALTER TABLE改变数据类型的示例。

执行如下SQL语句,改变Persons表中DateOfBirth列的数据类型为year。现在DateOfBirth列的类型是year,可以存放2位或4位格式的年份。

ALTER TABLE Persons
MODIFY COLUMN DateOfBirth year;

  • ALTER TABLE删除列的示例。

执行如下SQL语句,删除Person表中的DateOfBirth列,然后查看Person表,可以看到DateOfBirth列已被删除。在体验完成之后,请您执行删表语句,再进行下一步的体验学习。

ALTER TABLE Persons
DROP COLUMN DateOfBirth;
SELECT * FROM Persons;
DROP TABLE Persons;

13.  AUTO INCREMENT字段

Auto-increment会在新记录插入表中时生成一个唯一的数字。

  • 在MySQL中的语法:
  • 执行如下SQL语句,创建Persons表并把ID列定义为Auto-increment主键字段。
CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
);

  • MySQL使用AUTO_INCREMENT关键字来执行Auto-increment任务。默认地,AUTO_INCREMENT的开始值是1,每条新记录递增1。要让AUTO_INCREMENT序列以其他的值起始,请使用下面的SQL语法。

执行如下SQL语句,让Persons表的AUTO_INCREMENT序列以100为起始值。

ALTER TABLE Persons AUTO_INCREMENT=100;

  • 要在Persons表中插入新记录,我们不必为ID列规定值(会自动添加一个唯一的值)。

执行如下SQL语句,在Persons表中插入一条记录。然后查看Person表。

INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen');
SELECT * FROM Persons;

实验链接:https://developer.aliyun.com/adc/scenario/6499111331e849d69b4f10711ba77210

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
7月前
|
SQL 存储 关系型数据库
SQL优化策略与实践:组合索引与最左前缀原则详解
本文介绍了SQL优化的多种方式,包括优化查询语句(避免使用SELECT *、减少数据处理量)、使用索引(创建合适索引类型)、查询缓存、优化表结构、使用存储过程和触发器、批量处理以及分析和监控数据库性能。同时,文章详细讲解了组合索引的概念及其最左前缀原则,即MySQL从索引的最左列开始匹配条件,若跳过最左列,则索引失效。通过示例代码,展示了如何在实际场景中应用这些优化策略,以提高数据库查询效率和系统响应速度。
290 10
|
8月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1064 2
|
9月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
281 2
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
1631 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
SQL 数据库
如何应用SQL约束条件?
【10月更文挑战第28天】如何应用SQL约束条件?
345 11
|
SQL 存储 Oracle
sql约束条件
【10月更文挑战第28天】sql约束条件
222 8
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
208 3