Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение записей вверх и вниз 
:(
    Опции темы
=Женек=
Дата 13.10.2013, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Господа, переписываю программу, переделываю сохранение параметров под работу с SQLite.
В предыдущей программе у меня была сортировка - допустим, есть список объектов, выделяю объект №5, жму кнопку "Move Down". Дальше, естественно, начинаются хитрые манипуляции - номер этого объекта увеличивается на единицу, то что было на единицу больше, уменьшается. А если в середину вставляется объект, то меняются номера всего, что располагается ниже.

Не обладает ли MySQL какой-то подобной функцией для записей?  Чтобы можно было просто сдвинуть элемент вверх или вниз соответствующей командой, без заведения отдельного поля с номером?
PM MAIL   Вверх
Akina
Дата 13.10.2013, 17:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Нет такого


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
tishaishii
Дата 19.10.2013, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



В MyISAM порядок заполнения таблицы важен.
Код
drop temporary table if exists `test` ;
create temporary table `test` engine = MyISAM ignore
select 2 as `a` , 2 as `b`
union all
select 1 as `a` , 3 as `b`
union all
select 3 as `a` , 4 as `b` ;

select `t1`.* from `test` as `t1` ;
/*
вывод:
2  2
1  3
3  4
*/

insert ignore into `test` select `t1`.* from `test` where `a` = 1 ;
delete `t1`.* from `test` as `t1` where `a` = 1 ;

select `t1`.* from `test` as `t1` ;
/*
вывод:
2  2
3  4
1  3
*/


Если создать первичный ключ, то упрорядочение по-умолчанию при выводе таблицы будет по первичному ключу.

Это сообщение отредактировал(а) tishaishii - 19.10.2013, 21:45
PM MAIL ICQ Skype   Вверх
Akina
Дата 21.10.2013, 07:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(tishaishii @  19.10.2013,  22:41 Найти цитируемый пост)
В MyISAM порядок заполнения таблицы важен.

Нет.

Цитата(tishaishii @  19.10.2013,  22:41 Найти цитируемый пост)
Если создать первичный ключ, то упрорядочение по-умолчанию при выводе таблицы будет по первичному ключу.

Кажется. что добавление "по умолчанию" не должно дать однозначно заявить "Нет". Однако именно оно является ошибочным. На его месте следует использовать "обычно" или "как правило".


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
tishaishii
Дата 25.10.2013, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Akina, а ты просто выполни. И потом скажешь своё "нет".
Не путай.
А то знаю тебя: с наскоку что-то увидел или где-то узнал и сразу своё мнение, потому что тема есть.


Вот исправил некоторые неточности в заполнении таблиц:
Код

drop temporary table if exists `test` ;
create temporary table `test` engine = MyISAM ignore
select 2 as `a` , 2 as `b`
union all
select 1 as `a` , 3 as `b`
union all
select 3 as `a` , 4 as `b` ;
select `t1`.* from `test` as `t1` ;
/*
вывод:
2  2
1  3
3  4
*/
insert ignore into `test` select 1 , 4 ;
delete `t1`.* from `test` as `t1` where `t1`.`a` = 1 and `t1`.`b` = 3;
select `t1`.* from `test` as `t1` ;
/*
вывод:
2  2
3  4
1  4
*/

Но суть осталась прежней.

Это сообщение отредактировал(а) tishaishii - 25.10.2013, 00:17
PM MAIL ICQ Skype   Вверх
Akina
Дата 25.10.2013, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



tishaishii
На трёх записях увидеть, что SQL-таблица - это куча, а не связный список, невозможно.
Я повторяю. Вполне серьёзно. Всякие сентенции насчёт того, что порядок заполнения таблиц важен - это бред сивой кобылы. Или, если хочешь, следствие неспособности понять, что без уникализирующего на уровне выходного набора order by этот выходной набор недетерминирован.
Мне, честно говоря, наплевать, поймёшь ты это или нет. Но если тебе по роду деятельности придётся когда-нибудь поднять голову выше наколенных поделок на сотню записей, непонимание этого факта обязательно сыграет с тобой злую шутку. Причём по морде и со всего размаха.


Впрочем, чего тянуть с хорошим делом? сейчас и начнём, раньше сядешь - моложе выйдешь...
Цитата(tishaishii @  19.10.2013,  22:41 Найти цитируемый пост)
Если создать первичный ключ, то упрорядочение по-умолчанию при выводе таблицы будет по первичному ключу.

Изменение 1
Код

mysql> drop temporary table if exists `test` ;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create temporary table `test` engine = MyISAM ignore
    -> select 2 as `a` , 2 as `b`
    -> union all
    -> select 1 as `a` , 3 as `b`
    -> union all
    -> select 3 as `a` , 4 as `b` ;
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select `t1`.* from `test` as `t1` ;
+---+---+
| a | b |
+---+---+
| 2 | 2 |
| 1 | 3 |
| 3 | 4 |
+---+---+
3 rows in set (0.00 sec)

mysql> alter table test add primary key (a);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> show create table test;
+-------+--------------------------------------------------
| Table | Create Table
                 |
+-------+--------------------------------------------------
| test  | CREATE TEMPORARY TABLE `test` (
  `a` bigint(20) NOT NULL DEFAULT '0',
  `b` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------
1 row in set (0.02 sec)

mysql> select `t1`.* from `test` as `t1` ;
+---+---+
| a | b |
+---+---+
| 2 | 2 |
| 1 | 3 |
| 3 | 4 |
+---+---+
3 rows in set (0.00 sec)

mysql> drop temporary table if exists `test` ;
Query OK, 0 rows affected (0.00 sec)

mysql>

Изменение 2
Код

mysql> drop temporary table if exists `test` ;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create temporary table `test` (a bigint primary key, b bigint) engine = MyISAM;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (a,b)
    -> select 2 as `a` , 2 as `b`
    -> union all
    -> select 1 as `a` , 3 as `b`
    -> union all
    -> select 3 as `a` , 4 as `b` ;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> show create table test;
+-------+-----------------------------------------------------------------------------
| Table | Create Table
+-------+-----------------------------------------------------------------------------
| test  | CREATE TEMPORARY TABLE `test` (
  `a` bigint(20) NOT NULL,
  `b` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------
1 row in set (0.00 sec)

mysql> select `t1`.* from `test` as `t1` ;
+---+------+
| a | b    |
+---+------+
| 2 |    2 |
| 1 |    3 |
| 3 |    4 |
+---+------+
3 rows in set (0.00 sec)

mysql> drop temporary table if exists `test` ;
Query OK, 0 rows affected (0.00 sec)

Первичный ключ есть в обоих случаях. Только чхал сервер на твои утверждения, что он, дескать, должен выводить записи по этому ключу... 

Никому он ничего не должен. Что не указано явно (в запросе или в документации), он делает так, как захочет. И никто ему не указ. Про порядок отдачи записей без указания в запросе ORDER BY в документации написано "как правило". Для не понявших перевожу - "соблюдается не всегда, и имеет полное право в любой момент не выполниться".


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0785 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.