restore_user_day_statistics_full.sql 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. -- Restore full schema for user_day_statistics (idempotent-ish)
  2. -- Date: 2026-01-28
  3. --
  4. -- Notes:
  5. -- - This script avoids TypeORM "synchronize" surprises by ensuring columns exist.
  6. -- - MySQL 8.0 does NOT support ADD COLUMN IF NOT EXISTS reliably across all syntaxes,
  7. -- so we use INFORMATION_SCHEMA checks + dynamic SQL.
  8. -- - It will try to add an FK to platform_accounts(id). If there are orphan rows, it will NOT add FK.
  9. USE media_manager;
  10. SET @db = DATABASE();
  11. SET @tbl = 'user_day_statistics';
  12. -- Helper: add column if missing
  13. -- play_count
  14. SET @col = 'play_count';
  15. SET @sql = (
  16. SELECT IF(
  17. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  18. 'SELECT 1',
  19. 'ALTER TABLE user_day_statistics ADD COLUMN play_count INT NOT NULL DEFAULT 0 AFTER works_count'
  20. )
  21. );
  22. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  23. -- comment_count
  24. SET @col = 'comment_count';
  25. SET @sql = (
  26. SELECT IF(
  27. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  28. 'SELECT 1',
  29. 'ALTER TABLE user_day_statistics ADD COLUMN comment_count INT NOT NULL DEFAULT 0 AFTER play_count'
  30. )
  31. );
  32. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  33. -- fans_increase
  34. SET @col = 'fans_increase';
  35. SET @sql = (
  36. SELECT IF(
  37. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  38. 'SELECT 1',
  39. 'ALTER TABLE user_day_statistics ADD COLUMN fans_increase INT NOT NULL DEFAULT 0 AFTER comment_count'
  40. )
  41. );
  42. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  43. -- like_count
  44. SET @col = 'like_count';
  45. SET @sql = (
  46. SELECT IF(
  47. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  48. 'SELECT 1',
  49. 'ALTER TABLE user_day_statistics ADD COLUMN like_count INT NOT NULL DEFAULT 0 AFTER fans_increase'
  50. )
  51. );
  52. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  53. -- share_count
  54. SET @col = 'share_count';
  55. SET @sql = (
  56. SELECT IF(
  57. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  58. 'SELECT 1',
  59. 'ALTER TABLE user_day_statistics ADD COLUMN share_count INT NOT NULL DEFAULT 0 AFTER like_count'
  60. )
  61. );
  62. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  63. -- collect_count
  64. SET @col = 'collect_count';
  65. SET @sql = (
  66. SELECT IF(
  67. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  68. 'SELECT 1',
  69. 'ALTER TABLE user_day_statistics ADD COLUMN collect_count INT NOT NULL DEFAULT 0 AFTER share_count'
  70. )
  71. );
  72. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  73. -- cover_click_rate (string)
  74. SET @col = 'cover_click_rate';
  75. SET @sql = (
  76. SELECT IF(
  77. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  78. 'ALTER TABLE user_day_statistics MODIFY COLUMN cover_click_rate VARCHAR(50) NOT NULL DEFAULT ''0''',
  79. 'ALTER TABLE user_day_statistics ADD COLUMN cover_click_rate VARCHAR(50) NOT NULL DEFAULT ''0'' AFTER collect_count'
  80. )
  81. );
  82. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  83. -- avg_watch_duration (string)
  84. SET @col = 'avg_watch_duration';
  85. SET @sql = (
  86. SELECT IF(
  87. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  88. 'ALTER TABLE user_day_statistics MODIFY COLUMN avg_watch_duration VARCHAR(50) NOT NULL DEFAULT ''0''',
  89. 'ALTER TABLE user_day_statistics ADD COLUMN avg_watch_duration VARCHAR(50) NOT NULL DEFAULT ''0'' AFTER cover_click_rate'
  90. )
  91. );
  92. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  93. -- total_watch_duration (string)
  94. SET @col = 'total_watch_duration';
  95. SET @sql = (
  96. SELECT IF(
  97. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  98. 'ALTER TABLE user_day_statistics MODIFY COLUMN total_watch_duration VARCHAR(50) NOT NULL DEFAULT ''0''',
  99. 'ALTER TABLE user_day_statistics ADD COLUMN total_watch_duration VARCHAR(50) NOT NULL DEFAULT ''0'' AFTER avg_watch_duration'
  100. )
  101. );
  102. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  103. -- completion_rate (string)
  104. SET @col = 'completion_rate';
  105. SET @sql = (
  106. SELECT IF(
  107. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND COLUMN_NAME=@col) > 0,
  108. 'ALTER TABLE user_day_statistics MODIFY COLUMN completion_rate VARCHAR(50) NOT NULL DEFAULT ''0''',
  109. 'ALTER TABLE user_day_statistics ADD COLUMN completion_rate VARCHAR(50) NOT NULL DEFAULT ''0'' AFTER total_watch_duration'
  110. )
  111. );
  112. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  113. -- Index on record_date
  114. SET @idx = 'idx_record_date';
  115. SET @sql = (
  116. SELECT IF(
  117. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA=@db AND TABLE_NAME=@tbl AND INDEX_NAME=@idx) > 0,
  118. 'SELECT 1',
  119. 'ALTER TABLE user_day_statistics ADD INDEX idx_record_date (record_date)'
  120. )
  121. );
  122. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  123. -- Foreign key to platform_accounts(id) if possible (no orphans)
  124. SET @fk = 'fk_user_day_statistics_account';
  125. SET @orphans = (
  126. SELECT COUNT(*)
  127. FROM user_day_statistics uds
  128. LEFT JOIN platform_accounts pa ON pa.id = uds.account_id
  129. WHERE pa.id IS NULL
  130. );
  131. SET @sql = (
  132. SELECT IF(
  133. (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA=@db AND TABLE_NAME=@tbl AND CONSTRAINT_NAME=@fk) > 0,
  134. 'SELECT 1',
  135. IF(@orphans > 0,
  136. 'SELECT ''Skip adding FK fk_user_day_statistics_account: orphan rows exist'' AS warning',
  137. 'ALTER TABLE user_day_statistics ADD CONSTRAINT fk_user_day_statistics_account FOREIGN KEY (account_id) REFERENCES platform_accounts(id) ON DELETE CASCADE'
  138. )
  139. )
  140. );
  141. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;