第 2 站练习答案
约束验证
sql
INSERT INTO product(sku, name, price)
VALUES ('BAD-1', 'invalid', -1.00);该语句应被 ck_product_price 拒绝。
订单项
sql
CREATE TABLE order_item (
order_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
quantity INT UNSIGNED NOT NULL,
unit_price DECIMAL(12,2) NOT NULL,
PRIMARY KEY (order_id, product_id),
CONSTRAINT ck_item_quantity CHECK (quantity > 0),
CONSTRAINT ck_item_price CHECK (unit_price >= 0),
CONSTRAINT fk_item_order
FOREIGN KEY (order_id) REFERENCES sales_order(order_id),
CONSTRAINT fk_item_product
FOREIGN KEY (product_id) REFERENCES product(product_id)
) ENGINE = InnoDB;组合主键同时表达唯一性并支持按 order_id 聚簇读取。若业务允许同一商品多行,需要独立 item_id 和另一套唯一规则。
email 大小写取决于登录和身份合并规则;不能让数据库默认排序规则替产品做决定。
加码题解:类型、精度与字符集
sql
SELECT CAST(123.45 AS DECIMAL(12,2)) AS amount,
CONVERT('订单' USING utf8mb4) AS label;关键推理
金额用 DECIMAL,文本显式使用 utf8mb4,时区字段按业务语义选择。
可替代方案
对外部时间统一存 UTC,再在展示层转换时区。
典型错误
用 DOUBLE 存金额,或让连接字符集与表字符集不一致。
复盘时请附上版本、隔离级别、执行计划或恢复位置中的相关证据;没有证据的“看起来正确”不算完成。