数据库基础(lab1:初始数据库)
数据库基础知识学习
(头歌实践平台)
lab1:初始数据库
一、数据库 (Database) 操作
-
连接数据库
- 在命令行中连接到MySQL服务器。
- 语法:
mysql -u用户名 -p密码 -h主机地址 - 示例:
mysql -uroot -p123123 -h127.0.0.1
-
创建数据库
- 创建一个新的数据库。数据库名区分大小写。
- 语法:
CREATE DATABASE 数据库名; - 示例:
CREATE DATABASE MyDb;
-
查看所有数据库
- 列出MySQL服务器上所有的数据库。
- 语法:
SHOW DATABASES;
-
选择数据库
- 在进行表操作前,需要先指定要操作的数据库。
- 语法:
USE 数据库名; - 示例:
USE MyDb;
二、表 (Table) 操作
-
创建表
- 在当前选择的数据库中创建一个新表。
- 语法:
CREATE TABLE 表名 ( 字段名1 数据类型 [约束], 字段名2 数据类型 [约束], ... ); - 示例:
CREATE TABLE t_user ( id INT, username VARCHAR(32), password VARCHAR(32) );
-
查看表结构
- 显示表的字段、数据类型等详细信息。
- 语法:
DESC 表名;或DESCRIBE 表名; - 示例:
DESC t_user;
-
删除表
- 从数据库中永久删除一个表。
- 语法:
DROP TABLE 表名;
三、常用约束 (Constraints)
约束用于保证表中数据的完整性和准确性。
-
主键约束 (PRIMARY KEY)
- 作用:唯一标识表中的每一条记录。主键列的值必须是唯一的且不能为NULL。
- 方式一:定义列时指定
CREATE TABLE t_user1 ( userId INT PRIMARY KEY, name VARCHAR(32) ); - 方式二:定义完所有列后指定
CREATE TABLE t_user1 ( userId INT, name VARCHAR(32), PRIMARY KEY(userId) ); - 联合主键:将多个字段组合成一个主键。
CREATE TABLE t_user2 ( name VARCHAR(32), phone VARCHAR(11), PRIMARY KEY(name, phone) );
-
外键约束 (FOREIGN KEY)
- 作用:保持数据的一致性,确保一个表中的字段值必须在另一个表的主键中存在。
- 语法:
CONSTRAINT 外键名 FOREIGN KEY (本表字段) REFERENCES 主表名(主表主键字段) - 示例:
-- 主表 CREATE TABLE t_dept ( deptId INT PRIMARY KEY, name VARCHAR(22) ); -- 从表,deptId是外键 CREATE TABLE t_emp ( id INT PRIMARY KEY, name VARCHAR(22), deptId INT, CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES t_dept(deptId) );
-
唯一约束 (UNIQUE)
- 作用:确保列中的所有值都是唯一的,但允许有一个NULL值。
- 语法:
字段名 数据类型 UNIQUE - 示例:
CREATE TABLE t_dept( id INT PRIMARY KEY, name VARCHAR(22) UNIQUE );
-
非空约束 (NOT NULL)
- 作用:确保列不能存储NULL值。
- 语法:
字段名 数据类型 NOT NULL - 示例:
CREATE TABLE t_dept( id INT PRIMARY KEY, name VARCHAR(22) NOT NULL );
-
默认约束 (DEFAULT)
- 作用:为列设置一个默认值。
- 语法:
字段名 数据类型 DEFAULT 默认值 - 示例:
CREATE TABLE t_emp( id INT PRIMARY KEY, sex VARCHAR(2) DEFAULT '男' );
-
自增 (AUTO_INCREMENT)
- 作用:当插入新记录时,自动为该字段生成一个唯一的、递增的数字。通常用于主键。
- 语法:
字段名 INT PRIMARY KEY AUTO_INCREMENT - 示例:
CREATE TABLE t_tmp ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) );
组合使用示例:
CREATE TABLE t_user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) NOT NULL UNIQUE,
sex VARCHAR(4) DEFAULT '男'
);
四、我遇到的问题与解决方案
1. 语法错误:ERROR 1064 (42000): You have an error in your SQL syntax
场景一:创建表时缺少 TABLE 关键字
- 错误代码:
create t_user1( ... ); - 原因:
CREATE语句后面必须跟上要创建的对象类型,如TABLE、DATABASE等。 - 正确写法:
CREATE TABLE t_user1( ... );
场景二:设置字符集时语法错误
- 错误代码:
CREATE TABLE t_user ( ... ) default charset-utf8; - 原因: 设置字符集时,关键字
charset和字符集名称之间应该用等号=连接,而不是连字符-。 - 正确写法:
CREATE TABLE t_user ( ... ) DEFAULT CHARSET=utf8; - 推荐: 现代应用建议使用
utf8mb4字符集以支持 emoji 等4字节字符。CREATE TABLE t_user ( ... ) DEFAULT CHARSET=utf8mb4;
2. 操作错误:ERROR 1046 (3D000): No database selected
- 原因: 在执行创建表
CREATE TABLE等需要数据库上下文的操作之前,没有使用USE命令指定要操作的数据库。 - 解决方案:
- 先选择数据库,再执行操作。
-- 1. 选择数据库 USE MyDb; -- 2. 创建表 CREATE TABLE t_user1 ( ... ); - 如果数据库不存在,需要先创建。
CREATE DATABASE MyDb; USE MyDb; CREATE TABLE t_user1 ( ... );
- 先选择数据库,再执行操作。
3. 概念理解:外键命名解析 (如 fk_emp_dept1)
外键的名称是自定义的,但遵循一定的命名规范可以大大提高可读性。
- 常见格式:
fk_从表名_主表名_序号 - 示例解析:
fk_emp_dept1fk: Foreign Key 的缩写,表明这是一个外键约束。emp: 从表名(t_emp)的简写。dept: 主表名(t_dept)的简写。1: 序号,当两个表之间有多个外键时用于区分。
- 为什么是
emp而不是t_emp?- 这是一种常见的简化约定,为了让名称更简洁,去掉了如
t_、tbl_等无实际业务含义的表前缀。这并非强制规则,关键在于团队内部保持命名风格统一。
- 这是一种常见的简化约定,为了让名称更简洁,去掉了如
浙公网安备 33010602011771号