рдореИрд╕реВрд░ рд╡рд┐рднрд╛рдЬрди рд╡рд░реНрд╖ рддрдХ (рддрд╛рд░реАрдЦ) / рдорд╣реАрдиреЗ (рддрд╛рд░реАрдЦ) / DAYOFWEEK (рддрд╛рд░реАрдЦ)

рдЕрдХреНрд╕рд░ рдореБрдЭреЗ рдЙрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдпрд╛ рдХрднреА рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рднрд┐рдиреНрди рд▓реЙрдЧ рд╣реИрдВред рдХреБрдЫ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдХреЛ "рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП" рд░рд┐рдХреЙрд░реНрдб рд░рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ "рдкреНрд░рдлреБрд▓реНрд▓рд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рдСрдкрд░реЗрд╢рди рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдбрд┐рд╕реНрдХ рдФрд░ рдПрдлрдПрд╕ рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рд╛рде рдЖрдП, рд╕рд░рд▓рддрдо - рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдПред рдЯреЗрдмрд▓ рдбреЗрдЯрд╛ рд╡рд╛рд▓реА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдИ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд╛рдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд┐рднрд╛рдЬрдиред рд▓реЙрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛ рдХреА рддрд╛рд░реАрдЦреЛрдВ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдЕрдХреНрд╕рд░ рд╕рд╛рд▓ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдпрд╛ рдорд╣реАрдиреЗ / рд╣рдлреНрддреЗ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдкрд╛рд░реНрдЯреАрд╢рди рдЯреЗрдмрд▓ рдореЗрдВ рдХрдЯреМрддреА рдХрд░рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реИред

рдХреБрдЫ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрдЯреМрддреА рдХрд░рдиреА рд╣реЛрдЧреАред


рдЪрд▓реЛ рдПрдХ рдЧреЛрд▓реА рдмрдирд╛рддреЗ рд╣реИрдВ:
CREATE TABLE `foo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `name` varchar(30) DEFAULT NULL, `email` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ); 


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╣реАрдиреЗ рдХреЗ рджрд┐рди рддрдХ рд▓реЙрдЧ рдЯреЗрдмрд▓ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣реА рд╣реИ, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдпрд╛ рджреЛ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХрдЯреМрддреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  ALTER TABLE foo PARTITION BY RANGE (YEAR(date_added)) ( PARTITION p2011 VALUES LESS THAN (2012) , PARTITION p2012 VALUES LESS THAN (2013) , PARTITION p2013 VALUES LESS THAN (2014) ); 


рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
 ERROR 1486 (HY000): Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed 

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдпрд╣ рд╣реИ: "рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕рддреНрд░ рдЯрд╛рдЗрдордЬрд╝реЛрди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред"

рдареАрдХ рд╣реИ:
 SELECT UNIX_TIMESTAMP('2012-01-01 00:00:00'); +---------------------------------------+ | UNIX_TIMESTAMP('2012-01-01 00:00:00') | +---------------------------------------+ | 1325361600 | +---------------------------------------+ SELECT UNIX_TIMESTAMP('2013-01-01 00:00:00'); +---------------------------------------+ | UNIX_TIMESTAMP('2013-01-01 00:00:00') | +---------------------------------------+ | 1356984000 | +---------------------------------------+ SELECT UNIX_TIMESTAMP('2014-01-01 00:00:00'); +---------------------------------------+ | UNIX_TIMESTAMP('2014-01-01 00:00:00') | +---------------------------------------+ | 1388520000 | +---------------------------------------+ 


рдЕрдм:
  ALTER TABLE foo PARTITION BY RANGE (UNIX_TIMESTAMP(date_added)) ( PARTITION p2011 VALUES LESS THAN (1325361600) , PARTITION p2012 VALUES LESS THAN (1356984000) , PARTITION p2013 VALUES LESS THAN (1388520000) , PARTITION pMAXVALUE VALUES LESS THAN (MAXVALUE) ); 


рдЕрдм, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
 ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function 


рдЗрд╕рдХрд╛ рдЙрдкрдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 ALTER table foo DROP PRIMARY KEY, add PRIMARY KEY (`id`,`date_added`); 


рдФрд░ рдлрд┐рд░ рд╕реЗ:
  ALTER TABLE foo PARTITION BY RANGE (UNIX_TIMESTAMP(date_added)) ( PARTITION p2011 VALUES LESS THAN (1325361600) , PARTITION p2012 VALUES LESS THAN (1356984000) , PARTITION p2013 VALUES LESS THAN (1388520000) , PARTITION pMAXVALUE VALUES LESS THAN (MAXVALUE) ); 


рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред

рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
 CREATE TABLE `foo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `name` varchar(30) DEFAULT NULL, `email` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`,`date_added`) ) ENGINE=InnoDB PARTITION BY RANGE (UNIX_TIMESTAMP(date_added)) (PARTITION p2011 VALUES LESS THAN (1325361600) ENGINE = InnoDB, PARTITION p2012 VALUES LESS THAN (1356984000) ENGINE = InnoDB, PARTITION p2013 VALUES LESS THAN (1388520000) ENGINE = InnoDB, PARTITION pMAXVALUE VALUES LESS THAN MAXVALUE ENGINE = InnoDB ); 


рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛!

"рд╕реНрд▓рд╛рдЗрд╕рд┐рдВрдЧ" рдХрд╛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рдбреЗрдЯрд╛ рдХреЛ "рдкреНрд░рддрд┐ рд╡рд░реНрд╖" рдпрд╛ рдорд╣реАрдиреЗ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╣реАрдиреЗ рдХреЗ рджрд┐рди рддрдХ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд░реНрдерд╛рддреН, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдпрд╛ рджреЛ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рд░рдЧрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХрдЯреМрддреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ:

  PARTITION BY RANGE (MONTH(date)) 

рдпрд╛ рддреЛ:

  PARTITION BY RANGE (DAY(date_add)) 

рдЯрд╛рдЗрдк рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред

Googling рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдЗрдо рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдареАрдХ рд╣реИ, рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ:
 CREATE TABLE `foo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_added` datetime DEFAULT NULL, `name` varchar(30) DEFAULT NULL, `email` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`,`date_added`) ) ENGINE=InnoDB; 


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ:
  `date_added` datetime DEFAULT NULL 


рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ CURRENT_TIMESTAMP рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░реЛрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЕрдм () рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╕рдорд╛рд░реЛрд╣ред

рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ date_added рдЕрдкрдиреЗ рдЖрдк рд╕реЗрдЯ рд╣реЛ рдЬрд╛рдПред

рджреЛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВ:
1. рдпрд╛, INSERT рдореЗрдВ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ, рдЕрднреА рдЬреЛрдбрд╝реЗрдВ ()ред
2. рдпрд╛ рддреЛ рдПрдХ рдЯреНрд░рд┐рдЧрд░ рд▓рдЯрдХрд╛рдПрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ date_added = Now () рд╣реЛрдЧрд╛;

рдЬрдм INSERT рдХреЛрдб рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдЬрдЧрд╣ INSERT рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ ... рдЕрдм () рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
 DELIMITER $$ USE `test_db`$$ CREATE TRIGGER `foo_add` BEFORE INSERT ON `foo` FOR EACH ROW BEGIN SET NEW.date_added = IFNULL(NEW.date_added, NOW()); END; $$ 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░, рдЪрд╛рдмрд┐рдпрд╛рдБ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИред

рдФрд░ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдорд╣реАрдирд╛ рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВ:
  ALTER TABLE foo PARTITION BY RANGE (MONTH(date_added)) ( PARTITION p01 VALUES LESS THAN (02) , PARTITION p02 VALUES LESS THAN (03) , PARTITION p03 VALUES LESS THAN (04) , PARTITION p04 VALUES LESS THAN (05) , PARTITION p05 VALUES LESS THAN (06) , PARTITION p06 VALUES LESS THAN (07) , PARTITION p07 VALUES LESS THAN (08) , PARTITION p08 VALUES LESS THAN (09) , PARTITION p09 VALUES LESS THAN (10) , PARTITION p10 VALUES LESS THAN (11) , PARTITION p11 VALUES LESS THAN (12) , PARTITION p12 VALUES LESS THAN (13) , PARTITION pmaxval VALUES LESS THAN MAXVALUE ); 

рдпрд╛ рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рди рднреА:
  ALTER TABLE foo PARTITION BY RANGE (DAYOFWEEK(date_added)) ( PARTITION p01 VALUES LESS THAN (2) , PARTITION p02 VALUES LESS THAN (3) , PARTITION p03 VALUES LESS THAN (4) , PARTITION p04 VALUES LESS THAN (5) , PARTITION p05 VALUES LESS THAN (6) , PARTITION p06 VALUES LESS THAN (7) , PARTITION p07 VALUES LESS THAN (8) , PARTITION pmaxval VALUES LESS THAN MAXVALUE ); 

рдпрд╛ рд╡рд┐рднрд╛рдЬрди рдкрд░ рднреА 2 рджрд┐рди:
 ALTER TABLE foo PARTITION BY LIST (DAY(date_added)) ( PARTITION p00 VALUES IN (0,1) , PARTITION p02 VALUES IN (2,3) , PARTITION p04 VALUES IN (4,5) , PARTITION p06 VALUES IN (6,7) , PARTITION p08 VALUES IN (8,9) , PARTITION p10 VALUES IN (10,11), PARTITION p12 VALUES IN (12,13), PARTITION p14 VALUES IN (14,15), PARTITION p16 VALUES IN (16,17), PARTITION p18 VALUES IN (18,19), PARTITION p20 VALUES IN (20,21), PARTITION p22 VALUES IN (22,23), PARTITION p24 VALUES IN (24,25), PARTITION p26 VALUES IN (26,27), PARTITION p28 VALUES IN (28,29), PARTITION p30 VALUES IN (30,31) ); 


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдм рд╕рдм рдХреБрдЫ рдЖрдкрдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИред

Source: https://habr.com/ru/post/In159131/


All Articles