Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

[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 389 Точки

Мъча тази задача от снощи и вече съм на ръба на нервната криза. 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 389 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.