123 lines
5.1 KiB
PL/PgSQL
123 lines
5.1 KiB
PL/PgSQL
-- ============================================
|
||
-- 修复缺失的vehicle_commands表
|
||
-- 补充vehicle_commands表创建并应用字段修复
|
||
-- 创建时间: 2025-01-15
|
||
-- ============================================
|
||
|
||
-- 1. 创建vehicle_commands表(如果不存在)
|
||
CREATE TABLE IF NOT EXISTS vehicle_commands (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
trans_id VARCHAR(100) NOT NULL,
|
||
timestamp TIMESTAMP NOT NULL,
|
||
vehicle_id VARCHAR(50) NOT NULL,
|
||
command_type VARCHAR(20) NOT NULL CHECK (command_type IN ('ALERT', 'SIGNAL', 'WARNING', 'RESUME', 'PARKING')),
|
||
command_reason VARCHAR(30) NOT NULL CHECK (command_reason IN ('TRAFFIC_LIGHT', 'AIRCRAFT_CROSSING', 'SPECIAL_VEHICLE', 'AIRCRAFT_PUSH', 'RESUME_TRAFFIC', 'PARKING_SIDE')),
|
||
signal_state VARCHAR(10) CHECK (signal_state IN ('RED', 'YELLOW', 'GREEN')),
|
||
intersection_id VARCHAR(50),
|
||
target_location GEOMETRY(POINT, 4326) NOT NULL,
|
||
relative_speed DOUBLE PRECISION,
|
||
relative_motion_x DOUBLE PRECISION,
|
||
relative_motion_y DOUBLE PRECISION,
|
||
min_distance DOUBLE PRECISION,
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 2. 创建索引
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_vehicle_id ON vehicle_commands(vehicle_id);
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_timestamp ON vehicle_commands(timestamp DESC);
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_trans_id ON vehicle_commands(trans_id);
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_command_type ON vehicle_commands(command_type);
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_created_at ON vehicle_commands(created_at);
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_location_gist ON vehicle_commands USING GIST(target_location);
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_vehicle_time ON vehicle_commands(vehicle_id, timestamp DESC);
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_type_time ON vehicle_commands(command_type, timestamp DESC);
|
||
|
||
-- 3. 添加表注释
|
||
COMMENT ON TABLE vehicle_commands IS '无人车控制指令表,用于存储发送给无人车的控制指令,支持轨迹回放和日志审计';
|
||
|
||
-- 4. 现在应用字段修复(这是之前失败的部分)
|
||
-- 添加license_plate字段
|
||
ALTER TABLE vehicle_commands ADD COLUMN IF NOT EXISTS license_plate VARCHAR(50);
|
||
|
||
-- 复制现有数据
|
||
UPDATE vehicle_commands SET license_plate = vehicle_id WHERE license_plate IS NULL;
|
||
|
||
-- 添加索引
|
||
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_license_plate ON vehicle_commands(license_plate);
|
||
|
||
-- 添加sys_vehicle_id字段
|
||
ALTER TABLE vehicle_commands ADD COLUMN IF NOT EXISTS sys_vehicle_id BIGINT;
|
||
|
||
-- 5. 添加字段注释
|
||
COMMENT ON COLUMN vehicle_commands.license_plate IS '车牌号,对应sys_vehicle_info.license_plate_number';
|
||
COMMENT ON COLUMN vehicle_commands.sys_vehicle_id IS '系统车辆ID,对应sys_vehicle_info.vehicle_id';
|
||
|
||
-- 6. 更新数据同步函数(重新创建以包含vehicle_commands表)
|
||
CREATE OR REPLACE FUNCTION update_sys_vehicle_id()
|
||
RETURNS void AS $$
|
||
BEGIN
|
||
-- 更新vehicle_locations表
|
||
UPDATE vehicle_locations vl
|
||
SET sys_vehicle_id = vi.vehicle_id
|
||
FROM sys_vehicle_info vi
|
||
WHERE vl.license_plate = vi.license_plate_number
|
||
AND vl.sys_vehicle_id IS NULL;
|
||
|
||
-- 更新vehicle_trajectories表
|
||
UPDATE vehicle_trajectories vt
|
||
SET sys_vehicle_id = vi.vehicle_id
|
||
FROM sys_vehicle_info vi
|
||
WHERE vt.license_plate = vi.license_plate_number
|
||
AND vt.sys_vehicle_id IS NULL;
|
||
|
||
-- 更新vehicle_commands表
|
||
UPDATE vehicle_commands vc
|
||
SET sys_vehicle_id = vi.vehicle_id
|
||
FROM sys_vehicle_info vi
|
||
WHERE vc.license_plate = vi.license_plate_number
|
||
AND vc.sys_vehicle_id IS NULL;
|
||
|
||
-- 更新rule_violation_events表
|
||
UPDATE rule_violation_events rve
|
||
SET sys_vehicle_id = vi.vehicle_id
|
||
FROM sys_vehicle_info vi
|
||
WHERE rve.license_plate = vi.license_plate_number
|
||
AND rve.sys_vehicle_id IS NULL
|
||
AND rve.subject_type = 'VEHICLE';
|
||
|
||
RAISE NOTICE '车辆ID同步完成(包含vehicle_commands表)';
|
||
END;
|
||
$$ LANGUAGE plpgsql;
|
||
|
||
-- 7. 执行一次数据同步
|
||
SELECT update_sys_vehicle_id();
|
||
|
||
-- 8. 验证修复结果
|
||
SELECT 'vehicle_commands' as table_name,
|
||
COUNT(*) as total_records,
|
||
COUNT(license_plate) as has_license_plate,
|
||
COUNT(sys_vehicle_id) as has_sys_vehicle_id
|
||
FROM vehicle_commands;
|
||
|
||
-- 9. 检查表结构
|
||
SELECT column_name, data_type, is_nullable
|
||
FROM information_schema.columns
|
||
WHERE table_name = 'vehicle_commands'
|
||
AND column_name IN ('vehicle_id', 'license_plate', 'sys_vehicle_id')
|
||
ORDER BY column_name;
|
||
|
||
-- ============================================
|
||
-- 完成提示
|
||
-- ============================================
|
||
|
||
DO $$
|
||
BEGIN
|
||
RAISE NOTICE '==============================================';
|
||
RAISE NOTICE 'vehicle_commands表修复完成!';
|
||
RAISE NOTICE '1. 创建了缺失的vehicle_commands表';
|
||
RAISE NOTICE '2. 添加了license_plate和sys_vehicle_id字段';
|
||
RAISE NOTICE '3. 更新了数据同步函数';
|
||
RAISE NOTICE '现在车辆ID映射关系已完全修复!';
|
||
RAISE NOTICE '==============================================';
|
||
END $$; |