Skip to content

第 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 存金额,或让连接字符集与表字符集不一致。

复盘时请附上版本、隔离级别、执行计划或恢复位置中的相关证据;没有证据的“看起来正确”不算完成。

用心记录每一步成长