feat(数据库): 修改VIP客户表索引为手机号和车牌号组合唯一

移除phone字段的唯一约束,添加phone和car_number的复合唯一索引
更新相关SQL脚本和PHP代码以支持新的索引规则
This commit is contained in:
2025-11-20 10:55:59 +08:00
parent 43a43929cc
commit f173149e28
5 changed files with 91 additions and 10 deletions
+3 -1
View File
@@ -193,11 +193,13 @@ carwash_order/
CREATE TABLE vip_customers (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
phone VARCHAR(20) NOT NULL UNIQUE COMMENT '联系电话(唯一)',
phone VARCHAR(20) NOT NULL COMMENT '联系电话',
car_model VARCHAR(50) COMMENT '车型',
car_number VARCHAR(20) COMMENT '车牌号',
email VARCHAR(100) COMMENT '邮箱地址',
birthday DATE COMMENT '生日',
-- 复合唯一索引:确保手机号和车牌号组合唯一
UNIQUE KEY idx_phone_car_number (phone, car_number)
notes TEXT COMMENT '备注信息',
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+4 -2
View File
@@ -6,7 +6,7 @@ USE carwash_booking;
CREATE TABLE IF NOT EXISTS vip_customers (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
phone VARCHAR(20) NOT NULL UNIQUE COMMENT '联系电话(唯一)',
phone VARCHAR(20) NOT NULL COMMENT '联系电话',
car_model VARCHAR(50) COMMENT '车型',
car_number VARCHAR(20) COMMENT '车牌号',
email VARCHAR(100) COMMENT '邮箱地址',
@@ -14,7 +14,9 @@ CREATE TABLE IF NOT EXISTS vip_customers (
notes TEXT COMMENT '备注信息',
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL
updated_at TIMESTAMP NULL,
-- 添加phone和car_number的复合唯一索引,确保手机号+车牌号组合不重复
UNIQUE INDEX idx_phone_car_number (phone, car_number)
);
-- 创建套餐表
+11
View File
@@ -0,0 +1,11 @@
-- 更新VIP客户表的索引结构
USE carwash_booking;
-- 1. 移除phone字段的UNIQUE约束(需要先删除原索引)
ALTER TABLE vip_customers DROP INDEX phone;
-- 2. 添加phone和car_number的复合唯一索引
ALTER TABLE vip_customers ADD UNIQUE INDEX idx_phone_car_number (phone, car_number);
-- 3. 验证索引添加成功
SHOW INDEX FROM vip_customers;
+59
View File
@@ -0,0 +1,59 @@
<?php
// 更新VIP客户表结构的PHP脚本
require 'db_connect.php';
try {
echo "开始更新VIP客户表结构...<br>";
// 1. 移除phone字段的UNIQUE约束
echo "正在移除phone字段的UNIQUE约束...<br>";
$stmt = $pdo->prepare("ALTER TABLE vip_customers DROP INDEX phone");
$stmt->execute();
echo "✓ phone字段UNIQUE约束已移除<br>";
// 2. 添加phone和car_number的复合唯一索引
echo "正在添加phone+car_number的复合唯一索引...<br>";
$stmt = $pdo->prepare("ALTER TABLE vip_customers ADD UNIQUE INDEX idx_phone_car_number (phone, car_number)");
$stmt->execute();
echo "✓ 复合唯一索引已添加<br>";
// 3. 验证索引
echo "正在验证索引...<br>";
$stmt = $pdo->prepare("SHOW INDEX FROM vip_customers");
$stmt->execute();
$indexes = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<br>✓ 索引列表:<br>";
echo "<table border='1' cellpadding='5' cellspacing='0'>";
echo "<tr><th>Table</th><th>Non_unique</th><th>Key_name</th><th>Column_name</th></tr>";
foreach ($indexes as $index) {
echo "<tr>";
echo "<td>{$index['Table']}</td>";
echo "<td>{$index['Non_unique']}</td>";
echo "<td>{$index['Key_name']}</td>";
echo "<td>{$index['Column_name']}</td>";
echo "</tr>";
}
echo "</table>";
echo "<br>✅ 数据库结构更新成功!";
} catch (PDOException $e) {
echo "<br><span style='color:red'>❌ 错误: " . $e->getMessage() . "</span><br>";
// 检查是否是因为索引不存在导致的错误
if (strpos($e->getMessage(), "doesn't exist") !== false) {
echo "可能是因为索引已经不存在,尝试直接添加复合索引...<br>";
try {
$stmt = $pdo->prepare("ALTER TABLE vip_customers ADD UNIQUE INDEX idx_phone_car_number (phone, car_number)");
$stmt->execute();
echo "✓ 复合唯一索引已添加<br>";
} catch (PDOException $e2) {
echo "<br><span style='color:red'>❌ 添加索引失败: " . $e2->getMessage() . "</span><br>";
}
}
} finally {
// 关闭连接
$pdo = null;
}
?>
+12 -5
View File
@@ -24,20 +24,27 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
throw new Exception('请填写客户姓名和联系电话');
}
// 检查VIP客户是否已存在
$stmt = $pdo->prepare("SELECT id FROM vip_customers WHERE phone = ?");
$stmt->execute([$phone]);
// 检查VIP客户是否已存在(基于手机号和车牌号组合)
$stmt = $pdo->prepare("SELECT id FROM vip_customers WHERE phone = ? AND car_number = ?");
$stmt->execute([$phone, $car_number]);
if ($stmt->fetch()) {
throw new Exception('该手机号已经是VIP客户');
throw new Exception('该手机号和车牌号组合已经是VIP客户');
}
// 插入VIP客户
$stmt = $pdo->prepare("INSERT INTO vip_customers
(customer_name, phone, car_model, car_number, email, birthday, notes)
VALUES (?, ?, ?, ?, ?, ?, ?)");
try {
$stmt->execute([$customer_name, $phone, $car_model, $car_number, $email, $birthday, $notes]);
$success_message = "VIP客户录入成功!";
} catch (PDOException $e) {
// 捕获唯一约束错误
if ($e->errorInfo[1] == 1062) { // MySQL唯一键约束错误码
throw new Exception('该手机号和车牌号组合已经是VIP客户');
}
throw $e; // 重新抛出其他类型的异常
}
} elseif ($action === 'delete_vip') {
$id = (int)$_POST['vip_id'];