init.sql 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. DROP DATABASE IF EXISTS hgssystem;
  2. CREATE DATABASE IF NOT EXISTS hgssystem;
  3. USE hgssystem;
  4. CREATE TABLE IF NOT EXISTS user -- 创建用户表
  5. (
  6. ID INT PRIMARY KEY AUTO_INCREMENT,
  7. UserID CHAR(32) NOT NULL UNIQUE CHECK (UserID REGEXP '[a-zA-Z0-9]{32}'),
  8. Name VARCHAR(50) NOT NULL,
  9. IsManager BIT NOT NULL DEFAULT 0 CHECK (IsManager IN (0, 1)),
  10. Phone CHAR(11) NOT NULL CHECK (Phone REGEXP '[0-9]{11}'),
  11. Score INT NOT NULL CHECK (Score <= 500 and Score >= 0),
  12. Reputation INT NOT NULL CHECK (Reputation <= 1000 and Reputation >= 1),
  13. CreateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  14. UserLock BIT NOT NULL DEFAULT 0
  15. );
  16. CREATE TABLE IF NOT EXISTS garbage -- 创建普通垃圾表
  17. (
  18. GarbageID INT PRIMARY KEY AUTO_INCREMENT,
  19. CreateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  20. Flat TINYINT NOT NULL DEFAULT 0 CHECK (Flat IN (0, 1, 2)),
  21. UserID CHAR(34),
  22. UseTime DATETIME,
  23. GarbageType TINYBLOB CHECK (GarbageType IS NULL OR GarbageType IN (1, 2, 3, 4)),
  24. Location VARCHAR(50),
  25. CheckResult BIT CHECK (CheckResult IS NULL OR CheckResult IN (0, 1)),
  26. CheckerID CHAR(34),
  27. FOREIGN KEY (UserID) REFERENCES user (UserID),
  28. FOREIGN KEY (CheckerID) REFERENCES user (UserID)
  29. );
  30. CREATE TABLE IF NOT EXISTS goods -- 商品
  31. (
  32. GoodsID INT PRIMARY KEY AUTO_INCREMENT,
  33. Name CHAR(100) NOT NULL,
  34. Quantity INT NOT NULL CHECK (Quantity >= 0),
  35. Score INT NOT NULL CHECK (Score > 0 and Score <= 500)
  36. );
  37. CREATE TABLE IF NOT EXISTS orders -- 订单
  38. (
  39. OrderID INT PRIMARY KEY AUTO_INCREMENT,
  40. UserID CHAR(34) NOT NULL,
  41. Status BIT NOT NULL DEFAULT 0,
  42. FOREIGN KEY (UserID) REFERENCES user (UserID)
  43. );
  44. CREATE TABLE IF NOT EXISTS ordergoods -- 订单内容
  45. (
  46. OrderGoodsID INT PRIMARY KEY AUTO_INCREMENT,
  47. OrderID INT NOT NULL,
  48. GoodsID INT NOT NULL,
  49. Quantity INT NOT NULL DEFAULT 1 CHECK (Quantity >= 0),
  50. FOREIGN KEY (OrderID) REFERENCES Orders (OrderID),
  51. FOREIGN KEY (GoodsID) REFERENCES Goods (GoodsID)
  52. );
  53. CREATE TABLE IF NOT EXISTS context
  54. (
  55. ContextID INT PRIMARY KEY AUTO_INCREMENT,
  56. Context TEXT NOT NULL,
  57. Author CHAR(34) NOT NULL,
  58. Time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  59. FOREIGN KEY (Author) REFERENCES user (UserID)
  60. );
  61. -- 创建视图
  62. DROP VIEW IF EXISTS garbage_n;
  63. CREATE VIEW garbage_n AS
  64. SELECT GarbageID, CreateTime
  65. FROM garbage
  66. WHERE Flat = 0;
  67. DROP VIEW IF EXISTS garbage_c;
  68. CREATE VIEW garbage_c AS
  69. SELECT GarbageID, CreateTime, UserID, UseTime, GarbageType, Location
  70. FROM garbage
  71. WHERE Flat = 1;
  72. DROP VIEW IF EXISTS garbage_u;
  73. CREATE VIEW garbage_u AS
  74. SELECT GarbageID,
  75. CreateTime,
  76. UserID,
  77. UseTime,
  78. GarbageType,
  79. Location,
  80. CheckerID,
  81. CheckResult
  82. FROM garbage
  83. WHERE Flat = 2;
  84. DROP VIEW IF EXISTS garbage_time;
  85. CREATE VIEW garbage_time AS
  86. SELECT GarbageID, UserID, UseTime
  87. FROM garbage
  88. WHERE Flat = 1
  89. OR Flat = 2;
  90. DROP VIEW IF EXISTS garbage_user;
  91. CREATE VIEW garbage_user AS
  92. SELECT GarbageID AS GarbageID,
  93. garbage.CreateTime AS CreateTime,
  94. garbage.UserID AS UserID,
  95. user.Name AS UserName,
  96. user.Phone AS UserPhone,
  97. user.Score AS UserScore,
  98. user.Reputation AS UserReputation,
  99. UseTime AS UseTime,
  100. GarbageType AS GarbageType,
  101. Location AS Location,
  102. CheckResult AS CheckResult,
  103. CheckerID AS CheckerID
  104. FROM garbage
  105. LEFT JOIN user on garbage.UserID = user.UserID;
  106. DROP VIEW IF EXISTS garbage_checker;
  107. CREATE VIEW garbage_checker AS
  108. SELECT GarbageID AS GarbageID,
  109. garbage.CreateTime AS CreateTime,
  110. garbage.UserID AS UserID,
  111. UseTime AS UseTime,
  112. GarbageType AS GarbageType,
  113. Location AS Location,
  114. CheckResult AS CheckResult,
  115. CheckerID AS CheckerID,
  116. user.Name AS CheckerName,
  117. user.Phone AS CheckerPhone,
  118. user.Score AS CheckerScore,
  119. user.Reputation AS CheckerReputation
  120. FROM garbage
  121. LEFT JOIN user on garbage.CheckerID = user.UserID;
  122. DROP VIEW IF EXISTS garbage_checker_user;
  123. CREATE VIEW garbage_checker_user AS
  124. SELECT garbage_user.GarbageID AS GarbageID,
  125. garbage_user.CreateTime AS CreateTime,
  126. garbage_user.UserID AS UserID,
  127. garbage_user.UserName AS UserName,
  128. garbage_user.UserPhone AS UserPhone,
  129. garbage_user.UserScore AS UserScore,
  130. garbage_user.UserReputation AS UserReputation,
  131. garbage_user.UseTime AS UseTime,
  132. garbage_user.GarbageType AS GarbageType,
  133. garbage_user.Location AS Location,
  134. garbage_user.CheckResult AS CheckResult,
  135. garbage_user.CheckerID AS CheckerID,
  136. garbage_checker.CheckerName AS CheckerName,
  137. garbage_checker.CheckerPhone AS CheckerPhone
  138. FROM garbage_user
  139. LEFT JOIN garbage_checker on garbage_user.GarbageID = garbage_checker.GarbageID;
  140. DROP VIEW IF EXISTS garbage_7d;
  141. CREATE VIEW garbage_7d AS
  142. SELECT (TO_DAYS(NOW()) - TO_DAYS(UseTime)) AS days,
  143. GarbageID,
  144. CreateTime,
  145. Flat,
  146. UserID,
  147. UseTime,
  148. GarbageType,
  149. Location,
  150. CheckResult,
  151. CheckerID
  152. FROM garbage
  153. WHERE TO_DAYS(NOW()) - TO_DAYS(UseTime) < 7;
  154. DROP VIEW IF EXISTS garbage_30d;
  155. CREATE VIEW garbage_30d AS
  156. SELECT (TO_DAYS(NOW()) - TO_DAYS(UseTime)) AS days,
  157. GarbageID,
  158. CreateTime,
  159. Flat,
  160. UserID,
  161. UseTime,
  162. GarbageType,
  163. Location,
  164. CheckResult,
  165. CheckerID
  166. FROM garbage
  167. WHERE TO_DAYS(NOW()) - TO_DAYS(UseTime) < 30;
  168. DROP VIEW IF EXISTS order_goods_view;
  169. CREATE VIEW order_goods_view AS
  170. SELECT ordergoods.OrderID AS OrderID, ordergoods.GoodsID AS GoodsID, ordergoods.Quantity AS Quantity, goods.Name AS Name
  171. FROM ordergoods
  172. JOIN goods on ordergoods.GoodsID = goods.GoodsID;
  173. DROP VIEW IF EXISTS context_user;
  174. CREATE VIEW context_user AS
  175. SELECT context.ContextID, context.Context, context.Time, user.UserID, user.Name
  176. FROM context
  177. JOIN user on context.Author = user.UserID;
  178. -- 创建函数
  179. CREATE FUNCTION get_avg(num1 int, num2 int)
  180. RETURNS DECIMAL(5, 4)
  181. not deterministic
  182. reads sql data
  183. COMMENT '计算两个数相除'
  184. BEGIN
  185. IF num2 = 0 or num1 = 0 THEN
  186. RETURN 0; -- 注释, 防止python在此处分割SQL
  187. END IF; -- 注释, 防止python在此处分割SQL
  188. RETURN num1 / num2; -- 注释, 防止python在此处分割SQL
  189. END;