菜鸟科技网

SQL命令创建表时如何指定主键?

SQL命令创建是数据库管理中的核心操作,它允许用户通过结构化查询语言(SQL)定义数据库对象的结构,如表、视图、索引等,SQL命令创建通常以CREATE关键字开头,后跟要创建的对象类型,例如CREATE TABLE、CREATE VIEW、CREATE INDEX等,这些命令不仅定义了对象的基本结构,还包含了约束、数据类型、索引等高级特性,以确保数据的完整性和查询效率,下面将详细介绍常用的SQL创建命令及其使用方法。

SQL命令创建表时如何指定主键?-图1
(图片来源网络,侵删)

CREATE TABLE是最常用的创建命令,用于定义数据库中的表结构,表由列和行组成,列定义了数据的属性,而行则存储具体的数据记录,在CREATE TABLE语句中,需要指定表的名称、列的名称、数据类型以及约束条件,创建一个名为“students”的表,包含学号(student_id)、姓名(student_name)、年龄(age)和班级(class)四列,可以使用以下命令:

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    student_name VARCHAR(50) NOT NULL,
    age INT CHECK (age > 0),
    class VARCHAR(20)
);

在这个例子中,student_id列被定义为主键(PRIMARY KEY),确保每条记录的唯一性;student_name列设置为非空(NOT NULL),表示该列必须有值;age列添加了检查约束(CHECK),确保年龄值大于0;class列则没有特殊约束,允许为空,数据类型的选择非常重要,例如INT用于整数,VARCHAR用于可变长度的字符串,而PRIMARY KEY、NOT NULL、CHECK等约束则用于保证数据的完整性和有效性。

除了基本列定义,CREATE TABLE还支持更复杂的结构,如外键约束、默认值和自动递增,外键(FOREIGN KEY)用于建立表与表之间的关联,确保引用的完整性,创建一个“courses”表,并通过外键与“students”表关联:

CREATE TABLE courses (
    course_id INT PRIMARY KEY,
    course_name VARCHAR(100) NOT NULL,
    student_id INT,
    FOREIGN KEY (student_id) REFERENCES students(student_id)
);

这里,student_id列作为外键,引用了“students”表的student_id主键,确保“courses”表中的每条记录都对应“students”表中存在的学生,默认值(DEFAULT)可以为列指定一个默认值,当插入数据时未提供该列的值,则使用默认值,为“students”表的class列设置默认值为“未分配”:

SQL命令创建表时如何指定主键?-图2
(图片来源网络,侵删)
ALTER TABLE students
ALTER COLUMN class SET DEFAULT '未分配';

自动递增(AUTO_INCREMENT或IDENTITY)通常用于主键列,确保每次插入新记录时自动生成一个唯一的递增值,在MySQL中使用AUTO_INCREMENT

CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY,
    student_name VARCHAR(50) NOT NULL,
    age INT,
    class VARCHAR(20)
);

在SQL Server中,则使用IDENTITY关键字:

CREATE TABLE students (
    student_id INT IDENTITY(1,1) PRIMARY KEY,
    student_name VARCHAR(50) NOT NULL,
    age INT,
    class VARCHAR(20)
);

CREATE VIEW用于创建虚拟表,其结果集由存储的SQL查询定义,视图并不存储实际数据,而是动态生成数据,常用于简化复杂查询或限制数据访问权限,创建一个只显示学生姓名和班级的视图:

CREATE VIEW student_class_view AS
SELECT student_name, class
FROM students;

之后,可以通过查询视图获取数据,

SQL命令创建表时如何指定主键?-图3
(图片来源网络,侵删)
SELECT * FROM student_class_view;

视图还可以包含参数化查询或连接多个表,提供更灵活的数据访问方式,需要注意的是,视图的基表(即视图引用的表)结构变更可能会影响视图的可用性,因此修改基表时需要谨慎。

CREATE INDEX用于提高查询性能,通过创建索引可以加速数据的检索速度,索引类似于书籍的目录,数据库系统通过索引快速定位到数据的位置,而无需扫描整个表,为“students”表的class列创建索引:

CREATE INDEX idx_class ON students (class);

索引的类型包括唯一索引(UNIQUE)、聚集索引(CLUSTERED)和非聚集索引(NONCLUSTERED),唯一索引确保列中的值唯一,而聚集索引决定了表中数据的物理存储顺序,非聚集索引则创建一个指向数据行的指针,在SQL Server中创建唯一索引:

CREATE UNIQUE INDEX idx_student_name ON students (student_name);

虽然索引可以显著提高查询性能,但会降低插入、更新和删除操作的速度,因为每次数据变更都需要更新索引,需要根据查询需求合理创建索引。

除了上述命令,SQL还支持创建存储过程、触发器、函数等数据库对象,存储过程是一组预编译的SQL语句,用于执行特定任务,

CREATE PROCEDURE get_student_by_id
    @student_id INT
AS
BEGIN
    SELECT * FROM students WHERE student_id = @student_id;
END;

触发器则是在特定事件(如INSERT、UPDATE、DELETE)发生时自动执行的SQL语句,常用于实现业务规则或数据完整性检查,创建一个触发器,在插入学生记录时检查年龄是否大于0:

CREATE TRIGGER check_age_before_insert
ON students
FOR INSERT
AS
BEGIN
    IF EXISTS (SELECT 1 FROM inserted WHERE age <= 0)
    BEGIN
        RAISERROR ('年龄必须大于0', 16, 1);
        ROLLBACK TRANSACTION;
    END
END;

函数则用于计算或返回一个值,可以是标量值函数(返回单个值)或表值函数(返回结果集),创建一个标量值函数,计算学生的年龄是否成年:

CREATE FUNCTION is_adult (@age INT)
RETURNS BIT
AS
BEGIN
    RETURN CASE WHEN @age >= 18 THEN 1 ELSE 0 END;
END;

在创建数据库对象时,需要注意以下几点:一是对象名称必须符合数据库系统的命名规则,避免使用保留关键字;二是合理选择数据类型和约束,确保数据的准确性和完整性;三是考虑性能影响,特别是索引的创建;四是测试创建的对象,确保其功能符合预期。

以下是一个简单的表格,总结了常用的SQL创建命令及其用途:

命令 用途 示例
CREATE TABLE 创建表结构 CREATE TABLE students (student_id INT PRIMARY KEY, student_name VARCHAR(50));
CREATE VIEW 创建虚拟表 CREATE VIEW student_view AS SELECT student_name FROM students;
CREATE INDEX 创建索引以提高查询性能 CREATE INDEX idx_name ON students (student_name);
CREATE PROCEDURE 创建存储过程 CREATE PROCEDURE get_students AS SELECT * FROM students;
TRIGGER 创建触发器以自动执行SQL语句 CREATE TRIGGER trg_insert ON students FOR INSERT AS ...
FUNCTION 创建函数以返回计算值 CREATE FUNCTION get_age (@student_id INT) RETURNS INT AS ...

以下是相关问答FAQs:

问题1:如何修改已创建的表结构?
解答:可以使用ALTER TABLE命令修改表结构,例如添加列、删除列或修改列的数据类型,为“students”表添加一个“gender”列:ALTER TABLE students ADD gender VARCHAR(10);,删除列则使用ALTER TABLE students DROP COLUMN gender;,修改列数据类型时需要注意数据兼容性,例如将VARCHAR改为TEXT:ALTER TABLE students MODIFY COLUMN student_name TEXT;(MySQL语法)。

问题2:如何删除已创建的数据库对象?
解答:可以使用DROP命令删除数据库对象,例如删除表、视图或索引,删除表时,表的结构和数据都会被永久删除,语法为DROP TABLE students;,删除视图使用DROP VIEW student_view;,删除索引使用DROP INDEX idx_name ON students;,需要注意的是,删除对象是不可逆的操作,建议在执行前备份数据。

分享:
扫描分享到社交APP
上一篇
下一篇