- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
if (!$left || !$right) return true;
$sql = "DELETE FROM {$this->_tableName} WHERE `user_id`=$user_id";
$this->_db->exec($sql);
if (!$this->_isTriggers) {
if (($right - $left) == 1) {
$sql = "UPDATE {$this->_tableName} SET `left`=IF(`left` >= $left,`left`-2,`left`),`right`=`right`-2 WHERE `right` >= $left";
} else {
$sql = "UPDATE {$this->_tableName} SET
`left`=IF(`left` BETWEEN $left AND $right,`left`-1,`left`),
`right`=IF(`right` BETWEEN $left AND $right,`right`-1,`right`),
`level`=IF(`left` BETWEEN $left AND $right,`level`-1,`level`),
`left`=IF(`left`>$right,`left`-2,`left`),
`right`=IF(`right`>$right,`right`-2,`right`)
WHERE `right` > $left
";
}
$this->_db->exec($sql);
Только ручной сбор запроса. Zend Db
Vasiliy 30.05.2013 20:23 # −2
или if (!$this->_isTriggers)
Сss в sql ?
bormand 30.05.2013 21:00 # +3
Рискну предположить, что так проверяется поддержка триггеров в текущей СУБД. И если это мистер мускуль ниже 5.0.2 триггеров нет - хуячим руками.
А колдунство с left и right это, с вероятностью 146%, удаление ноды из дерева, представленного в виде nested set'а.
bormand 30.05.2013 20:47 # +5
Dates ... TEST SKIPPED
Manual query building ... OK
MySQL only ... OK
Non-atomic logic without transactions ... OK
Scan result: genuine PHP style detected.
eth0 30.05.2013 20:53 # +1
Ну оно какбэ обычно на то и расчёт. Других баз почти не существует, да и не нужны они.
Я вот теперь серьёзно думаю переводить проекты на постгрес, а поддержку mysql сделать deprecated.
bormand 30.05.2013 20:55 # +2
Луч света в тёмном царстве...
inkanus-gray 30.05.2013 22:37 # 0
В чём же главное преимущество Постгреса перед мистером Мускулом, а то получается, что с InnoDB жить можно?
bormand 30.05.2013 22:46 # +4
После общения с постгресом с мускулом возиться влом, хотя к сожалению недавно пришлось (см. Кабинку).
Lowezar 31.05.2013 00:45 # +3
bormand 31.05.2013 06:05 # 0
Lowezar 31.05.2013 08:37 # 0
"На мускуль надейся, а код проверяй."
...А вот если ключ на время убрать, а после изменения на NOT NULL заново создать - тогда не пускает, ругается.
eth0 31.05.2013 06:22 # 0
inkanus-gray 31.05.2013 07:09 # 0
eth0 31.05.2013 17:04 # 0
Но лучше, чем ничего.
inkanus-gray 31.05.2013 18:18 # 0
У стандартного MERGE страшноватый синтаксис: он требует наличия таблицы (пусть и временной), из которой копировать, и допускает более сложное условие для выбора между вставкой и заменой. Вроде и более гибко, но будет страшно выглядеть, если нам всего лишь нужно вставить одну строку констант.
Кстати, у MySQL есть ещё одна нестандартная вещь: движок под названием MERGE, чтобы совсем нескучно было. CREATE TABLE ... ENGINE=MERGE UNION=(таблица1, таблица2) мержит две таблицы типа MyISAM.
bormand 31.05.2013 18:25 # 0
Это эффективней, нежели view на union'е?
eth0 31.05.2013 18:58 # 0
guest 14.11.2015 13:03 # 0
guest 20.11.2015 15:05 # 0
guest 24.11.2015 09:40 # 0
guest 14.11.2015 13:57 # 0
guest8 11.07.2020 03:52 # −999