题-MySQL数据库

以下是关于数据库中表格的一份简要笔记:

1. account 表格

  • 字段:

    • userid:用户ID
    • fullname:全名
    • password:密码
    • sex:性别
    • address:地址
    • email:电子邮件
    • phone:电话号码
  • 约束:

    • 主键:userid
    • 性别检查约束:只能是’男’或’女’
  • 记录:

    • 包含了一些用户的信息,如刘晓和、张嘉庆等。

2. category 表格

  • 字段:

    • catid:分类ID
    • catname:分类名称
  • 约束:

    • 主键:catid
  • 记录:

    • 包含了一些宠物分类,如鸟类、猫、狗等。

3. lineitem 表格

  • 字段:

    • orderid:订单ID
    • itemid:商品ID
    • quantity:数量
    • unitprice:单价
  • 约束:

    • 主键:(orderid, itemid)
    • 外键:itemid关联到product表的productid
    • 外键:orderid关联到orders表的orderid
  • 记录:

    • 包含了一些订单明细,如商品ID、数量、单价等。

4. orders 表格

  • 字段:

    • orderid:订单ID
    • userid:用户ID
    • orderdate:订单日期
    • totalprice:总价
    • status:状态
  • 约束:

    • 主键:orderid
    • 外键:userid关联到account表的userid
  • 记录:

    • 包含了一些订单信息,如用户ID、订单日期、总价等。

5. product 表格

  • 字段:

    • productid:商品ID
    • catid:分类ID
    • name:商品名称
    • descn:商品描述
    • listprice:标价
    • unitcost:成本
    • qty:库存数量
  • 约束:

    • 主键:productid
    • 外键:catid关联到category表的catid
  • 记录:

    • 包含了一些商品信息,如商品名称、描述、价格等。

这是对数据库中主要表格结构和内容的简要概述。

当创建数据库时,通常按照以下步骤执行SQL指令。下面是每个指令的详细解析:

1. SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;

这两个指令用于设置字符集和禁用外键检查。utf8mb4 是一种Unicode字符集,通常用于支持各种语言的字符。禁用外键检查可以使表的创建和插入数据的过程更顺利。

2. 创建 account 表格

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 创建 account 表格
CREATE TABLE `account` (
`userid` char(6) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`fullname` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`password` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`sex` char(2) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`address` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`email` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`phone` varchar(11) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
PRIMARY KEY (`userid`) USING BTREE,
-- CONSTRAINT `chk_sex` CHECK (`sex` in (_gbk'??',_gbk'Ů'))
CONSTRAINT `chk_sex` CHECK (`sex` IN ('男', '女'))
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
  • 解析:
    • 创建了一个名为 account 的表格,包含了用户信息的字段。
    • 使用了 charvarchar 等字段类型,设置了字符集为 utf8mb3
    • 定义了主键 (userid) 和性别检查约束 (sex 只能为’男’或’女’)。

3. 插入 account 表格数据

1
2
3
4
-- 插入 account 表格数据
INSERT INTO `account` VALUES ('u0001', '刘晓和', '123456', '男', '广东深圳市', 'liuxh@163.com', '13512345678');
INSERT INTO `account` VALUES ('u0002', '张嘉庆', '123456', '男', '广东深圳市', 'zhangjq@163.com', '13512345679');
-- ...(其他插入语句)
  • 解析:
    • account 表格插入了一些示例数据,包括用户ID、全名、密码等。

4. 创建 category 表格

1
2
3
4
5
6
-- 创建 category 表格
CREATE TABLE `category` (
`catid` char(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`catname` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`catid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
  • 解析:
    • 创建了一个名为 category 的表格,用于存储宠物分类信息。
    • 设置了 charvarchar 字段,并定义了主键 (catid)。

5. 插入 category 表格数据

1
2
3
4
-- 插入 category 表格数据
INSERT INTO `category` VALUES ('01', '鸟类');
INSERT INTO `category` VALUES ('02', '猫');
-- ...(其他插入语句)
  • 解析:
    • category 表格插入了一些示例数据,包括分类ID和分类名称。

6. 创建 lineitem 表格

1
2
3
4
5
6
7
8
9
10
11
-- 创建 lineitem 表格
CREATE TABLE `lineitem` (
`orderid` int NOT NULL,
`itemid` char(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`quantity` int NOT NULL,
`unitprice` decimal(10, 2) NOT NULL,
PRIMARY KEY (`orderid`, `itemid`) USING BTREE,
INDEX `fk_itemid`(`itemid` ASC) USING BTREE,
CONSTRAINT `fk_itemid` FOREIGN KEY (`itemid`) REFERENCES `product` (`productid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_orderid` FOREIGN KEY (`orderid`) REFERENCES `orders` (`orderid`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
  • 解析:
    • 创建了一个名为 lineitem 的表格,用于存储订单明细信息。
    • 包含了外键,将 itemid 关联到 product 表的 productid,将 orderid 关联到 orders 表的 orderid

7. 插入 lineitem 表格数据

1
2
3
4
-- 插入 lineitem 表格数据
INSERT INTO `lineitem` VALUES (20130411, 'FI-SW-01', 10, 18.50);
INSERT INTO `lineitem` VALUES (20130411, 'FI-SW-02', 12, 16.50);
-- ...(其他插入语句)
  • 解析:
    • lineitem 表格插入了一些示例数据,包括订单ID、商品ID、数量、单价等。

8. 创建 orders 表格

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 创建 orders 表格
CREATE TABLE `orders` (
`orderid` int NOT NULL AUTO_INCREMENT,
`userid` char(6) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`orderdate` datetime NOT NULL,
`totalprice` decimal(10, 2) NULL DEFAULT NULL,
`status` tinyint(1) NULL DEFAULT NULL,
PRIMARY KEY (`orderid`) USING BTREE,
INDEX `fk_userid`(`userid` ASC) USING BTREE,
CONSTRAINT `fk_userid` FOREIGN KEY (`userid`) REFERENCES `account` (`userid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT =

Dynamic;
  • 解析:
    • 创建了一个名为 orders 的表格,用于存储订单信息。
    • 包含了外键,将 userid 关联到 account 表的 userid

9. 插入 orders 表格数据

1
2
3
4
-- 插入 orders 表格数据
INSERT INTO `orders` VALUES (20130411, 'u0001', '2013-04-11 15:07:34', 500.00, 1);
INSERT INTO `orders` VALUES (20130412, 'u0002', '2013-04-09 15:09:11', 305.60, 0);
-- ...(其他插入语句)
  • 解析:
    • orders 表格插入了一些示例数据,包括订单ID、用户ID、订单日期、总价等。

10. 创建 product 表格

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 创建 product 表格
CREATE TABLE `product` (
`productid` char(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`catid` char(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`name` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`descn` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL,
`listprice` decimal(10, 2) NULL DEFAULT NULL,
`unitcost` decimal(10, 2) NULL DEFAULT NULL,
`qty` int NOT NULL,
PRIMARY KEY (`productid`) USING BTREE,
INDEX `fk_catid`(`catid` ASC) USING BTREE,
CONSTRAINT `fk_catid` FOREIGN KEY (`catid`) REFERENCES `category` (`catid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
  • 解析:
    • 创建了一个名为 product 的表格,用于存储商品信息。
    • 包含了外键,将 catid 关联到 category 表的 catid

11. 插入 product 表格数据

1
2
3
4
-- 插入 product 表格数据
INSERT INTO `product` VALUES ('AU-CB-01', '05', '亚马逊鹦鹉', '75岁以上高龄的好伙伴', 50.00, 60.00, 100);
INSERT INTO `product` VALUES ('AU-SB-02', '05', '燕雀', '非常好的减压宠物', 45.00, 50.00, 98);
-- ...(其他插入语句)
  • 解析:
    • product 表格插入了一些示例数据,包括商品ID、分类ID、商品名称、描述、价格等。

12. SET FOREIGN_KEY_CHECKS = 1;

用于启用外键检查,保证数据的完整性。

这样,整个数据库的创建、表格定义和数据插入过程就完成了。这份报告详细解析了每个指令的作用以及表格的结构和数据。如果你有其他问题或需要进一步的解释,请告诉我。

下面是数据库文件中的全部指令:

按照指令的执行顺序和优先级,下面是按照优先级排序的表格:

优先级指令说明
1SET NAMES utf8mb4;设置字符集为 utf8mb4,通常用于支持各种语言的字符。
2SET FOREIGN_KEY_CHECKS = 0;禁用外键检查,允许在导入数据时不考虑外键关联的完整性。
3DROP TABLE IF EXISTS account;如果存在表格 account,则删除它。
4CREATE TABLE account ...创建名为 account 的表格,用于存储用户账户信息。包括字段 userid, fullname, password, sex, address, email, phone 等。
5INSERT INTO account VALUES ...account 表格插入一些示例数据,包括用户ID、全名、密码、性别等。
6DROP TABLE IF EXISTS category;如果存在表格 category,则删除它。
7CREATE TABLE category ...创建名为 category 的表格,用于存储宠物分类信息。包括字段 catid, catname
8INSERT INTO category VALUES ...category 表格插入一些示例数据,包括分类ID和分类名称。
9DROP TABLE IF EXISTS lineitem;如果存在表格 lineitem,则删除它。
10CREATE TABLE lineitem ...创建名为 lineitem 的表格,用于存储订单明细信息。包括字段 orderid, itemid, quantity, unitprice 等。同时,定义了两个外键关联到 product 表的 productidorders 表的 orderid
11INSERT INTO lineitem VALUES ...lineitem 表格插入一些示例数据,包括订单ID、商品ID、数量、单价等。
12DROP TABLE IF EXISTS orders;如果存在表格 orders,则删除它。
13CREATE TABLE orders ...创建名为 orders 的表格,用于存储订单信息。包括字段 orderid, userid, orderdate, totalprice, status 等。同时,定义了一个外键关联到 account 表的 userid
14INSERT INTO orders VALUES ...orders 表格插入一些示例数据,包括订单ID、用户ID、订单日期、总价等。
15DROP TABLE IF EXISTS product;如果存在表格 product,则删除它。
16CREATE TABLE product ...创建名为 product 的表格,用于存储商品信息。包括字段 productid, catid, name, descn, listprice, unitcost, qty 等。同时,定义了一个外键关联到 category 表的 catid
17INSERT INTO product VALUES ...product 表格插入一些示例数据,包括商品ID、分类ID、商品名称、描述、价格等。
18SET FOREIGN_KEY_CHECKS = 1;启用外键检查,确保数据的完整性。

这份表格提供了对每个指令的简要说明

4.4.3 Petstore数据修改与删除操作

1.修改数据

(1).设新从澳大利亚购进一批天使鱼,数量为50尾,进价为15元/尾,请按库存与新进商品的平均值调整商品的成本价格。该商品将以高出成本价格20%的市场价格卖出,请调整商品的市场价格和数量

调整商品的成本价格:成本价格=(库存数量*成本价格+50*15)/(库存量+50)

1
2
3
update product 
set unitcost=(qty*unitcost+50*15)/(qty+50)
where name='天使鱼';

调整商品的市场价格和数量

1
2
3
update product 
set listprice = unitcost *1.2,qty=qty+50
where name='天使鱼';

或一次性调整所有数据

1
2
3
4
update product 
set unitcost =(qty* unitcost +50*15)/(qty+50),
listprice = unitcost *1.2,qty=qty+50
where name='天使鱼';

(2)订单号为“20130411”的订单已经发货,请将该订单的状态修改为“1”,同时根据该订单的订单明细表修改商品表的库存。

修改订单状态

1
2
3
update orders 
set status=1
where orderid= '20130411';

修改商品表的库存

1
2
3
4
update lineitem,product  
set product.qty= product.qty-lineitem.quantity
where lineitem.itemid= product.productid
and lineitem.orderid='20130411';

如果想要一次修改所有数据,则涉及三表操作,可将上面两条update语句合并为一条update语句。

1
2
3
4
5
6
update orders,lineitem,product  
set orders.status=1,
product.qty= product.qty-lineitem.quantity
where orders.orderid=lineitem.orderid
and lineitem.itemid= product.productid
and orders.orderid='20130411';

2.删除数据

(1).请将用户号为“u0004”的所有订购信息删除,并删除其用户记录。

(2).删除其所有订购信息,包括订单表和订单明细表的信息。

1
2
3
4
delete orders,lineitem 
from orders,lineitem
where orders.orderid=lineitem.orderid
and orders.userid='u0004';

(3).删除其所有订购信息,包括用户表、订单表和订单明细表的信息。

1
2
3
4
5
delete account,orders,lineitem
from account,orders,lineitem
where account.userid=orders.userid
and orders.orderid=lineitem.orderid
and account.userid='u0004';

3.5.3 建立数据完整性约束

  1. product表中的“catid”列引用了category表中的“catid”。请为product表中的“catid”列创建外键,以保证当要删除category表中的“catid”列的值时,如果product表中的“catid”列还有该值的记录,则拒绝对category表的删除操作。(提示:使用了外键约束restrict)

    product 表中的 catid 列创建外键,并使用 RESTRICT 约束,可以通过以下 SQL 语句实现:

    1
    2
    3
    4
    5
    6
    -- 在 product 表中添加外键约束
    ALTER TABLE product
    ADD CONSTRAINT fk_catid -- 外键约束的名称,这里为 fk_catid
    FOREIGN KEY (catid) -- 外键列,即 product 表中的 catid 列
    REFERENCES category(catid) -- 关联表和关联列,这里为 category 表的 catid 列
    ON DELETE RESTRICT; -- 定义删除操作时的行为,即拒绝删除 category 表中仍有关联值的记录

    解析细节:

    • ALTER TABLE product:指定要修改的表是 product 表。
    • ADD CONSTRAINT fk_catid:给外键约束起一个名称,这里取名为 fk_catid
    • FOREIGN KEY (catid):指定 product 表中的列 catid 作为外键列。
    • REFERENCES category(catid):指定关联的表是 category 表,关联的列是 catid 列。
    • ON DELETE RESTRICT:定义删除操作时的行为。这里是 RESTRICT,表示如果在 category 表中删除某个 catid,但在 product 表中还有引用了这个 catid 值的记录,将会拒绝删除。

    这样的外键约束将确保 product 表中的 catid 列的值必须是 category 表中的 catid 列的存在值,并且在删除 category 表中的匹配行时,如果在 product 表中仍有引用这个 catid 的记录,将会拒绝删除。

  2. orders表中的“userid”列引用了account表中的“userid”。请为orders表中的“userid”列创建外键,以保证当要删除和更新account表中的数据时,只要orders表中还有该客户的订单,就拒绝对account表进行删除和更新操作。(提示:使用了外键约束restrict)

    1
    2
    3
    4
    5
    alter table orders 
    add foreign key (userid)
    references account(userid)
    on delete restrict
    on update restrict;

    这条 SQL 指令是用于在 orders 表中添加一个外键约束,将 userid 列与 account 表中的 userid 列进行关联。下面是详细的解析:

    1
    2
    3
    4
    5
    6
    7
    -- 在 orders 表中添加外键约束
    ALTER TABLE orders
    ADD CONSTRAINT fk_userid -- 指定外键约束的名称,这里为 fk_userid
    FOREIGN KEY (userid) -- 指定 orders 表中的列,即外键列,这里为 userid
    REFERENCES account(userid) -- 指定关联表和关联列,这里为 account 表的 userid 列
    ON DELETE RESTRICT -- 定义删除操作时的行为,这里是 RESTRICT,表示拒绝删除关联表中的 userid 值
    ON UPDATE RESTRICT; -- 定义更新操作时的行为,这里是 RESTRICT,表示拒绝更新关联表中的 userid 值

    解析细节:

    • ALTER TABLE orders:指定要修改的表是 orders 表。
    • ADD CONSTRAINT fk_userid:给外键约束起一个名称,这里取名为 fk_userid,方便后续管理和识别。
    • FOREIGN KEY (userid):指定 orders 表中的列 userid 作为外键列。
    • REFERENCES account(userid):指定关联的表是 account 表,关联的列是 userid 列。
    • ON DELETE RESTRICT:定义在删除操作时的行为。这里是 RESTRICT,表示如果在 account 表中要删除某个 userid,但在 orders 表中有关联的记录存在,将会拒绝删除。即,要删除 account 表中的 userid 值,必须先删除在 orders 表中引用了这个 userid 值的记录。
    • ON UPDATE RESTRICT:定义在更新操作时的行为。这里是 RESTRICT,表示如果在 account 表中更新某个 userid,但在 orders 表中有关联的记录存在,将会拒绝更新。即,要更新 account 表中的 userid 值,必须先更新在 orders 表中引用了这个 userid 值的记录。

    总的来说,这个外键约束确保了在 orders 表中的 userid 列的值必须是 account 表中的 userid 列的存在值,同时定义了在删除或更新关联表中的 userid 值时的行为。

  3. lineitem表中的“itemid”列引用了product表中的“productid”。请为lineitem表中的“itemid”列创建外键,以保证当要删除和更新product表中的商品号时,自动删除或更新lineitem表中匹配的行。(提示:使用了级联约束cascade)

    lineitem 表中的 itemid 列创建外键,并使用级联约束 CASCADE,可以通过以下 SQL 语句实现:

    1
    2
    3
    4
    5
    6
    7
    -- 在 lineitem 表中添加外键约束
    ALTER TABLE lineitem
    ADD CONSTRAINT fk_itemid -- 外键约束的名称,这里为 fk_itemid
    FOREIGN KEY (itemid) -- 外键列,即 lineitem 表中的 itemid 列
    REFERENCES product(productid) -- 关联表和关联列,这里为 product 表的 productid 列
    ON DELETE CASCADE -- 定义删除操作时的级联行为,即删除关联表中的记录时,同时删除 lineitem 表中的匹配行
    ON UPDATE CASCADE; -- 定义更新操作时的级联行为,即更新关联表中的记录时,同时更新 lineitem 表中的匹配行

    解析细节:

    • ALTER TABLE lineitem:指定要修改的表是 lineitem 表。
    • ADD CONSTRAINT fk_itemid:给外键约束起一个名称,这里取名为 fk_itemid
    • FOREIGN KEY (itemid):指定 lineitem 表中的列 itemid 作为外键列。
    • REFERENCES product(productid):指定关联的表是 product 表,关联的列是 productid 列。
    • ON DELETE CASCADE:定义在删除操作时的行为。这里是 CASCADE,表示如果在 product 表中删除某个 productid,将会自动删除在 lineitem 表中引用了这个 productid 值的记录。
    • ON UPDATE CASCADE:定义在更新操作时的行为。这里是 CASCADE,表示如果在 product 表中更新某个 productid,将会自动更新在 lineitem 表中引用了这个 productid 值的记录。

    这样,创建的外键约束将确保 lineitem 表中的 itemid 列的值必须是 product 表中的 productid 列的存在值,并且在删除或更新 product 表中的匹配行时,会自动进行相应的级联操作。

  4. lineitem表中的“orderid”列引用了orders表中的“orderid”。请为lineitem表中的“orderid”列创建外键,以保证当要删除orders表中的订单号时,自动删除lineitem表中匹配的行。(提示:使用了级联约束cascade)

    lineitem 表中的 orderid 列创建外键,并使用级联约束 CASCADE,可以通过以下 SQL 语句实现:

    1
    2
    3
    4
    5
    6
    -- 在 lineitem 表中添加外键约束
    ALTER TABLE lineitem
    ADD CONSTRAINT fk_orderid -- 外键约束的名称,这里为 fk_orderid
    FOREIGN KEY (orderid) -- 外键列,即 lineitem 表中的 orderid 列
    REFERENCES orders(orderid) -- 关联表和关联列,这里为 orders 表的 orderid 列
    ON DELETE CASCADE; -- 定义删除操作时的行为,即删除 orders 表中的订单时,自动删除 lineitem 表中匹配的行

    解析细节:

    • ALTER TABLE lineitem:指定要修改的表是 lineitem 表。
    • ADD CONSTRAINT fk_orderid:给外键约束起一个名称,这里取名为 fk_orderid
    • FOREIGN KEY (orderid):指定 lineitem 表中的列 orderid 作为外键列。
    • REFERENCES orders(orderid):指定关联的表是 orders 表,关联的列是 orderid 列。
    • ON DELETE CASCADE:定义删除操作时的行为。这里是 CASCADE,表示如果在 orders 表中删除某个订单号,将会自动删除在 lineitem 表中引用了这个订单号的记录。

    这样的外键约束将确保 lineitem 表中的 orderid 列的值必须是 orders 表中的 orderid 列的存在值,并且在删除 orders 表中的匹配行时,会自动进行相应的级联操作。

  5. 为account表中的“sex”列添加check完整性约束,以保证性别只能包含“男”或“女”。

    要为 account 表中的 sex 列添加 CHECK 完整性约束,以保证性别只能包含“男”或“女”,可以使用以下 SQL 语句:

    1
    2
    3
    4
    -- 在 account 表中添加 CHECK 约束
    ALTER TABLE account
    ADD CONSTRAINT chk_sex -- 约束的名称,这里为 chk_sex
    CHECK (sex IN ('男', '女')); -- CHECK 约束,确保 sex 列的值只能是 '男' 或 '女'

    解析细节:

    • ALTER TABLE account:指定要修改的表是 account 表。
    • ADD CONSTRAINT chk_sex:给 CHECK 约束起一个名称,这里取名为 chk_sex
    • CHECK (sex IN ('男', '女')):定义 CHECK 约束的条件,确保 sex 列的值只能是 ‘男’ 或 ‘女’。

    这样的 CHECK 约束将阻止在 account 表中插入或更新 sex 列的值,如果不是 ‘男’ 或 ‘女’ 将会触发约束错误。这有助于维护数据的一致性和完整性。