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
a.angelov avatar a.angelov 1316 Точки

Ето моят код за създаване и разделяне на таблицата:

CREATE TABLE IF NOT EXISTS test (
    id INT NOT NULL AUTO_INCREMENT,
    date DATETIME,
    text TEXT,
    UNIQUE KEY (id, date)
)
PARTITION BY RANGE ( YEAR(date) ) (
    PARTITION p0 VALUES LESS THAN (1990),
    PARTITION p1 VALUES LESS THAN (2000),
    PARTITION p2 VALUES LESS THAN (2010),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

Точно абсолютната глупост, която си прочел е решението. Аз поне по друг начин не успях да я направя :)

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Да, таблицата става така, но това е против логиката на нещата. Ако задам като Primary Key комбинацията от ID и Date, какво ще попречи да имам един запис с Id 5 Date 01.02.2010 и още един ID 5 Date 10,05.2016? Нали идеята на ID е да бъде уникално? Не мога да разбера защо са направили нещата така.

-1
a.angelov avatar a.angelov 1316 Точки

Нали на ID-то имам AUTO_INCREMENT - няма как да се случи повторение.

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Май така ще трябва да го направя, колкото и да изглежда абсурдно. Мерси.

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