2012-03-05 4 views
5

Я хочу ограничить значение поля в строке таблицы определенным диапазоном. Можно ли ограничить поле отношений field_level до [0.00 до 1.00]?Хотите ограничить значение поля MySQL определенным диапазоном (десятичные значения)

В настоящее время я использую DECIMAL (2,2), это не позволило бы DECIMAL (1,2), поскольку M должно быть> = D. Я предполагаю, что тип данных DECIMAL (2,2) будет фактически разрешить значения от 00.00 до 99.99?

CREATE TABLE relationships (
    from_user_id MEDIUMINT UNSIGNED NOT NULL, 
    to_user_id MEDIUMINT UNSIGNED NOT NULL, 
    relationship_level DECIMAL(2,2) UNSIGNED NOT NULL, 
    PRIMARY KEY (from_user_id, to_user_id), 
    FOREIGN KEY (from_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION, 
    FOREIGN KEY (to_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION, 
    INDEX relationship_from_to (to_user_id, from_user_id, relationship_level) 
) ENGINE = INNODB; 

Есть ли лучший способ сделать это, может ли кто-либо предвидеть какие-либо ограничения?

Большое спасибо!

+1

Если вы действительно хотите, чтобы ограничить значения от '0.00 '' '1.00', вы должны использовать' DECIMAL (3,2) 'тип данных и FK, ссылаясь на« стабильную »(справочную) таблицу, всего на 101 строку. Как ответ на ваш другой вопрос: [Ограничьте значение типа данных MySQL до определенного диапазона] (http://stackoverflow.com/questions/9249695/limit-the-value-of-a-mysql-datatype-to -a-specific-range-предпочтительно-not-enum) –

+0

Отлично. Я предполагал, что это будет связано с чем-то похожим на это (с FK, ссылающимся на другую таблицу, ограничивающую диапазон). Мне просто интересно, существует ли более эффективный метод для предыдущего подхода. Большое спасибо. – leokennedy

+1

Есть еще одна возможность, но я не использовал ее, поэтому я не знаю никаких проблем. Определите обновляемый вид с помощью опции «WITH CHECK OPTION». Но тогда вам придется использовать только этот вид вместо таблицы (по крайней мере для вложений и обновлений): [CREATE VIEW Syntax] (http://dev.mysql.com/doc/refman/5.1/en/create -view.html) –

ответ

2

Вы можете имитировать ограничение проверки в MySQL с помощью триггеров.

Например, если вы хотите, чтобы все значения больше, чем 1,00, которые будут храниться как 1,00, вы могли бы сделать это с 2-триггеров, как это:

DELIMITER $$ 

DROP TRIGGER IF EXISTS tr_b_ins_relationships $$ 

CREATE TRIGGER tr_b_ins_relationships BEFORE INSERT ON relationships FOR EACH ROW BEGIN 
    IF new.relationship_level > 1 
    THEN 
    SET new.relationship_level = 1; 
    END IF; 
END $$ 

DELIMITER ; 


DELIMITER $$ 

DROP TRIGGER IF EXISTS tr_b_upd_relationships $$ 

CREATE TRIGGER tr_b_upd_relationships BEFORE UPDATE ON relationships FOR EACH ROW BEGIN 
    IF new.relationship_level > 1 
    THEN 
    SET new.relationship_level = 1; 
    END IF; 
END $$ 

DELIMITER ; 
+0

Триггеры звучат отлично, я думаю, что буду использовать их для решения этой проблемы и в нескольких других местах. Благодаря! – leokennedy

+0

Яблоко звучало отлично (и выглядело yummy) к Адаму тоже. [Являются ли базы данных триггерами зло?] (Http://stackoverflow.com/questions/460316/are-database-triggers-evil) –

+1

Я утверждаю, что это разумное использование триггеров, особенно учитывая тот факт, что MySQL не поддерживает контрольные ограничения , –

3

На самом деле, DECIMAL(2,2) позволит десятичное число до 2-х мест, ОБА которых распределены на десятичные знаки. Максимальное значение для этого поля будет 0.99, а минимальным будет 0.00.

Чтобы ограничить значения до 00.00 до 99.99, используйте DECIMAL(4,2) UNSIGNED.

+0

Хорошо, спасибо за разъяснение диапазона, который я мог бы получить от использования DECIMAL (2,2) = [0.00 до 0.99]. Возможно ли ограничить его таким образом, чтобы достичь диапазона от 0,00 до 1,00? Я предполагаю, что он будет включать альтернативы типу DECIMAL. – leokennedy

+1

Нет, вы не можете использовать ограничение '[0.00 до 1.00]'. С 'DECIMAL (3,2) UNSIGNED' вы могли бы быть от 0.00 до 9.99 –

+0

Вы можете ограничить его, используя ПЕРЕД ВСТАВКОЙ/ОБНОВЛЕНИЕМ. Вы можете либо принудить значения, либо вызвать ошибку, установив столбец NOT NULL в NULL в триггере. – nnichols