feat(数据库): 修改VIP客户表索引为手机号和车牌号组合唯一
移除phone字段的唯一约束,添加phone和car_number的复合唯一索引 更新相关SQL脚本和PHP代码以支持新的索引规则
This commit is contained in:
@@ -193,11 +193,13 @@ carwash_order/
|
|||||||
CREATE TABLE vip_customers (
|
CREATE TABLE vip_customers (
|
||||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
|
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_model VARCHAR(50) COMMENT '车型',
|
||||||
car_number VARCHAR(20) COMMENT '车牌号',
|
car_number VARCHAR(20) COMMENT '车牌号',
|
||||||
email VARCHAR(100) COMMENT '邮箱地址',
|
email VARCHAR(100) COMMENT '邮箱地址',
|
||||||
birthday DATE COMMENT '生日',
|
birthday DATE COMMENT '生日',
|
||||||
|
-- 复合唯一索引:确保手机号和车牌号组合唯一
|
||||||
|
UNIQUE KEY idx_phone_car_number (phone, car_number)
|
||||||
notes TEXT COMMENT '备注信息',
|
notes TEXT COMMENT '备注信息',
|
||||||
is_active BOOLEAN DEFAULT TRUE,
|
is_active BOOLEAN DEFAULT TRUE,
|
||||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|||||||
+4
-2
@@ -6,7 +6,7 @@ USE carwash_booking;
|
|||||||
CREATE TABLE IF NOT EXISTS vip_customers (
|
CREATE TABLE IF NOT EXISTS vip_customers (
|
||||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
|
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_model VARCHAR(50) COMMENT '车型',
|
||||||
car_number VARCHAR(20) COMMENT '车牌号',
|
car_number VARCHAR(20) COMMENT '车牌号',
|
||||||
email VARCHAR(100) COMMENT '邮箱地址',
|
email VARCHAR(100) COMMENT '邮箱地址',
|
||||||
@@ -14,7 +14,9 @@ CREATE TABLE IF NOT EXISTS vip_customers (
|
|||||||
notes TEXT COMMENT '备注信息',
|
notes TEXT COMMENT '备注信息',
|
||||||
is_active BOOLEAN DEFAULT TRUE,
|
is_active BOOLEAN DEFAULT TRUE,
|
||||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
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)
|
||||||
);
|
);
|
||||||
|
|
||||||
-- 创建套餐表
|
-- 创建套餐表
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
?>
|
||||||
@@ -24,20 +24,27 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
throw new Exception('请填写客户姓名和联系电话');
|
throw new Exception('请填写客户姓名和联系电话');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查VIP客户是否已存在
|
// 检查VIP客户是否已存在(基于手机号和车牌号组合)
|
||||||
$stmt = $pdo->prepare("SELECT id FROM vip_customers WHERE phone = ?");
|
$stmt = $pdo->prepare("SELECT id FROM vip_customers WHERE phone = ? AND car_number = ?");
|
||||||
$stmt->execute([$phone]);
|
$stmt->execute([$phone, $car_number]);
|
||||||
if ($stmt->fetch()) {
|
if ($stmt->fetch()) {
|
||||||
throw new Exception('该手机号码已经是VIP客户');
|
throw new Exception('该手机号和车牌号组合已经是VIP客户');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入VIP客户
|
// 插入VIP客户
|
||||||
$stmt = $pdo->prepare("INSERT INTO vip_customers
|
$stmt = $pdo->prepare("INSERT INTO vip_customers
|
||||||
(customer_name, phone, car_model, car_number, email, birthday, notes)
|
(customer_name, phone, car_model, car_number, email, birthday, notes)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?)");
|
VALUES (?, ?, ?, ?, ?, ?, ?)");
|
||||||
$stmt->execute([$customer_name, $phone, $car_model, $car_number, $email, $birthday, $notes]);
|
try {
|
||||||
|
$stmt->execute([$customer_name, $phone, $car_model, $car_number, $email, $birthday, $notes]);
|
||||||
$success_message = "VIP客户录入成功!";
|
$success_message = "VIP客户录入成功!";
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
// 捕获唯一约束错误
|
||||||
|
if ($e->errorInfo[1] == 1062) { // MySQL唯一键约束错误码
|
||||||
|
throw new Exception('该手机号和车牌号组合已经是VIP客户');
|
||||||
|
}
|
||||||
|
throw $e; // 重新抛出其他类型的异常
|
||||||
|
}
|
||||||
|
|
||||||
} elseif ($action === 'delete_vip') {
|
} elseif ($action === 'delete_vip') {
|
||||||
$id = (int)$_POST['vip_id'];
|
$id = (int)$_POST['vip_id'];
|
||||||
|
|||||||
Reference in New Issue
Block a user