exec($sql); } self::addColumn($db, 'persons', 'birth_rank', "ADD COLUMN `birth_rank` INT DEFAULT NULL COMMENT '家中排行(同一对父母的子女里,1=老大),用来算长子/次女' AFTER `gender`"); self::addColumn($db, 'persons', 'is_placeholder', "ADD COLUMN `is_placeholder` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '虚拟人物:还没弄清真实身份的占位(如「我的父亲」)' AFTER `note`"); self::widenRoleEnum($db); } /** 列不存在才加 */ private static function addColumn(\PDO $db, string $table, string $column, string $alter): void { $st = $db->prepare( 'SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?' ); $st->execute([$table, $column]); if ((int)$st->fetchColumn() === 0) { $db->exec("ALTER TABLE `{$table}` {$alter}"); } } /** accounts.role 原本只有 admin/member,升级时要把 guest 加进枚举 */ private static function widenRoleEnum(\PDO $db): void { $st = $db->prepare( "SELECT COLUMN_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'accounts' AND COLUMN_NAME = 'role'" ); $st->execute(); $type = (string)$st->fetchColumn(); if ($type !== '' && strpos($type, 'guest') === false) { $db->exec( "ALTER TABLE `accounts` MODIFY COLUMN `role` ENUM('admin','member','guest') NOT NULL DEFAULT 'member' COMMENT '管理员 / 家庭成员 / 访客'" ); } } }