Софтуерно Инженерство
Loading...
Hristo_Penchev avatar Hristo_Penchev 388 Точки

[Homework] Бази данни - SQL Performance - Problem 3

Здравейте, колеги,

Отварям темата, понеже срещнах затруднения със задачата и се надявам да успеем да си помогнем взаимно. След известно ровене в нета стигнах до следния код за партишънинг по години:

CREATE TABLE performance_test (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
date DATETIME,
text VARCHAR(500)
)

PARTITION BY RANGE (YEAR(date)) (
    PARTITION 90s VALUES LESS THAN (2001),
    PARTITION 2000s VALUES LESS THAN (2011),
    PARTITION 2010s VALUES LESS THAN (2021)
);

Получавам следната грешка:

Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function

След ровене в гугъл намерих следното:

https://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

Явно не мога да го разбера, написаното ми звучи като абсолютна глупост. Нито искам датата да е уникална, нито искам да включвам Id-то в комбинация с дата за уникалност. Някой борил ли се е със задачата? Нека сподели. 

Тагове:
0
Advanced Level: Back-End 06/07/2015 09:27:46
Hristo_Penchev avatar Hristo_Penchev 388 Точки

Мъча тази задача от снощи и вече съм на ръба на нервната криза. MySQL прави нещата буквално както си иска, копирани от документацията им кодове дават грешки, дори успя да се прецака и се наложи да го преинсталирам. Надявам се през живота ми да не ми се наложи да пиша повече на тази глупост. Започнах да оценявам Майкрософт.

Та след като изпуснах парата по-горе, да задам въпроса си. Някой намери ли нормален читав начин да се направи цикъл, с който да напълним таблицата?  Изрових следното:

https://dev.mysql.com/doc/refman/5.0/en/loop.html

 

Това, че не може да се направи цикъл без процедура е първото малоумие, но здраве да е. Първо, открих, че за да работи, отгоре трябва да му се сложи DELIMITER // (не ме питайте защо, нямам си никаква идея). Та, процедурата вече може да се направи. Но идва следния проблем. Ако малко модифицирам заявката, вече не искам p1 да ми се подава като аргумент. а да го декларирам като променлива вътре в цикъла. 

DELIMITER //
CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 DEFAULT 0
  label1: LOOP
  SELECT 1;
    SET p1 = p1 + 1;
    IF p1 < 10 THEN
      ITERATE label1;
    END IF;
    LEAVE label1;
  END LOOP label1;
  
END;
  

При опит да създам процедурата, реве, че има грешка. Ама каква, защо, как? Никой не ти казва. Уж така се декларира променлива, ама май не баш. Опитах с WHILE, същия ...проблем. Та, ще съм благодарен ако някой сподели как стават нещата и къде ми е грешката.

Поздрави!

0
Hristo_Penchev avatar Hristo_Penchev 388 Точки

Намерих проблема. Вътре в процедурата променливите се пишат с @ и не е нужно да се декларират, просто се прави @p1 = 0

0