Ценности константы MySql

Я делаю некоторые математические операции в своей базе данных, и я хотел бы объявить ценности константы, которые будут известны во всех моих процедурах. (Как ПИ, например)

Есть ли что-нибудь как это в MySql?

4
nl ja de
@h2ooooooo, это был просто пример, я хочу объявить свой собственный constans
добавлено автор Ilya Gazman, источник
К ВАШЕМУ СВЕДЕНИЮ, ПИ () возвратит ПИ.
добавлено автор h2ooooooo, источник

3 ответы

here som functions in mathematik

и можно определить константы как этот

 SET @myVar = 3;

EDIT HERE an example of this

   set @var1 := 0;
   set @var2 := @var1 := 5;
   select @var1, @var2;
    +--------+--------+
    | @var1 | @var2 |
    +--------+--------+
    | 5      | 5      | 
    +--------+--------+

здесьsomexamples

2
добавлено
отредактированный с некоторыми примерами.
добавлено автор echo_Me, источник
Но я буду в состоянии использовать свой вар во всех моих процедурах?
добавлено автор Ilya Gazman, источник
Я столкнулся с этой темой в поисках ответов на тот же самый вопрос. Мой поиск также нашел, "Как определить константу, которая могла использоваться через несколько процедур?" в forums.mysql.com/read.php? 98,273432,274722#msg-274722 и "Хранимая процедура с константами", в forums.mysql.com/read.php? 98,655459,655471#msg-655471. Хотя меньше, чем идеал, я планирую осуществить мой как локальные переменные с именами, написанными в ВЕРХНЕМ РЕГИСТРЕ, как обычная практика в кругах C++ и C.
добавлено автор David A. Gray, источник

Старый вопрос, но поскольку я теперь исследую эту проблему сам здесь, составляет мои два цента:

Насколько я могу сказать, что нет такой вещи как пользователь определимой константы. Однако, вы могли создать функцию и иметь ее, возвращают стоимость, которую вы хотите:

CREATE FUNCTION `kMyConstant` ()
    NO SQL
    DETERMINISTIC
RETURNS TINYINT UNSIGNED
BEGIN
RETURN 0;
END

Это, очевидно, возвратилось бы 0 каждых раз.

Я вполне уверен, что это было бы невероятно неэффективно по сравнению только с помещением 0 в вашем коде, но это будет все еще бежать в очень небольшой части секунды (каждый раз).

Предупредите что, если вставлено вопрос как: обновление myTable установил myVariable = kMyConstant (); есть два мудрые работой возможных исхода:

  • , помещая ДЕТЕРМИНИРОВАННЫЙ в определение, поскольку параметры не изменяются за ряд, это будет только оценено однажды.
  • оптимизатор MySQL не настолько умен.

Работа выходит в стороне, по крайней мере, вы могли тогда рассеять kMyConstant() всюду по вашему коду и знать, что это всегда будет той же самой стоимостью, и если вы хотите измениться, стоимость возвратила вас, просто изменяют функцию.

PS. Если это, действительно оказывается, переоценивает его слишком часто тогда, вы могли бы всегда начинать, ваши процедуры устанавливают @kMyConstant = kMyConstant (); и затем используют @kMyConstant , но кодирующие накладные расходы растут, таким образом, я предполагаю, что ваш пробег будет зависеть от того, как и как часто вы будете использовать константу.

2
добавлено

Если найдено ниже удовлетворения решения. Это основано на компиляторной оптимизации, которая заменяет столы константами, если результат выражения может возвратить только единственный ряд, посмотрите Руководство MySQL. Это, например, имеет место, определяя ценность уникальной, непустой колонки.

Это имеет особенно смысл, если вы имеете несколько констант и не делаете wan't, чтобы создать функцию для каждого из них. В качестве награды можно удобно отредактировать постоянные величины (если они служат некоторой цели конфигурации, не обязательно, если вы хотите изменить пи) при помощи некоторого frontend – вместо того, чтобы пересмотреть функции. Могло бы также быть легче передать базу данных, потому что демпинг столов легче, чем демпинг функций.

CREATE TABLE `constant` (
  `id` varchar(45) NOT NULL,
  `double_value` DOUBLE DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO constant VALUE ('pi', 3.1415);

SELECT constant.double_value/4 FROM constant WHERE constant.id = 'pi';
-- is translated into SELECT 3.1415/4 

SELECT table1.field1/constant.double_value 
  FROM table1, constant 
  WHERE constant.id = 'pi';
-- is translated into SELECT table1.field1/3.1415 FROM table1
1
добавлено
Можно также управлять правами проще, давая права доступа (, ИЗБРАННЫЙ ) к столу константы вместо того, чтобы teadiously дать , ВЫПОЛНЯЮТ право на все постоянные функции.
добавлено автор Xenos, источник
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw