Notice: Use of undefined constant REQUEST_URI - assumed 'REQUEST_URI' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 2

Notice: Use of undefined constant DOCUMENT_ROOT - assumed 'DOCUMENT_ROOT' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 5

Notice: Use of undefined constant REQUEST_URI - assumed 'REQUEST_URI' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 5

Notice: Use of undefined constant DOCUMENT_ROOT - assumed 'DOCUMENT_ROOT' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 11

Notice: Use of undefined constant REQUEST_URI - assumed 'REQUEST_URI' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 11

Notice: Use of undefined constant REQUEST_URI - assumed 'REQUEST_URI' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 28

Notice: Use of undefined constant REQUEST_URI - assumed 'REQUEST_URI' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 28

Notice: Use of undefined constant REQUEST_URI - assumed 'REQUEST_URI' in /var/www/www-root/data/www/sound-talk.ru/index.php on line 28

Notice: Undefined variable: flag in /var/www/www-root/data/www/sound-talk.ru/index.php on line 28

Notice: Undefined variable: adsense7 in /var/www/www-root/data/www/sound-talk.ru/index.php on line 39

Notice: Undefined variable: adsense6 in /var/www/www-root/data/www/sound-talk.ru/index.php on line 40
Удалить колонку из таблицы mysql. Gentoo Way Linux, Gentoo, Kubuntu, Ubuntu, Debian … компилируем всё!

Михаил Наумов. Удалить колонку из таблицы mysql


MySQL. Удаление внешнего ключа из таблицы

Не работает такой подход?

mysql> alter table `<Название таблицы>` -> drop foreign key `<Название столбца>`;

Выдает что-то наподобие этого?

ERROR 1025 (HY000): Error on rename of './database/table' to './database/#sql2-3ac-7e' (errno: 152)

Тогда эта статья для Вас.

Как исправить ситуацию?

  1. Открываем системную базу данных information_schema. mysql> use `information_schema`;
  2. Ищем в ней нужный нам ключ (который хотим удалить). Описываем в запросе, где он находится. mysql> select CONSTRAINT_NAME from KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA = '<Название базы данных>' and TABLE_NAME = '<Название таблицы>' and COLUMN_NAME = '<Название колонки с ключом>';
  3. Запоминаем его название.
  4. Открываем нужную базу данных (ту, в которой собираемся удалять внешний ключ). mysql> use `<Название базы данных>`;
  5. И удаляем его. mysql> alter table `<Название таблицы>` drop foreign key `<Ключ, который запомнили в пункте 3>`;

Предупреждение.

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

+----------------+------------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------------------+------+-----+---------+----------------+ ... | field_with_key | int(10) | YES | MUL | NULL | | ... +----------------+------------------------------+------+-----+---------+----------------+

 

Пример.

Есть таблица классов.

+---------------+------------------------------+------+-----+---------+----------------+ | Field         | Type                         | Null | Key | Default | Extra          | +---------------+------------------------------+------+-----+---------+----------------+ | id            | int(10)                      | NO   | PRI | NULL    | auto_increment | | name          | varchar(100)                 | NO   |     | NULL    |                | | learn         | tinyint(1) unsigned zerofill | NO   |     | NULL    |                | | parent        | int(10)                      | YES  | MUL | NULL    |                | | speciality_id | int(10)                      | NO   | MUL | NULL    |                | | stream_id     | int(10)                      | NO   | MUL | NULL    |                | +---------------+------------------------------+------+-----+---------+----------------+

Нужно удалить внешний ключ `parent`.

  1. Открываем системную базу данных information_schema.
  2. Ищем в ней нужный нам ключ. mysql> select CONSTRAINT_NAME from KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA = 'school_database' and TABLE_NAME = 'class' and COLUMN_NAME = 'parent';

    Получаем что-то вроде этого…

    +-----------------+ | CONSTRAINT_NAME | +-----------------+ | class_ibfk_1 | +-----------------+
  3. Запоминаем его название (`class_ibfk_1`).
  4. Открываем нужную базу данных (ту, в которой собираемся удалять внешний ключ). mysql> use `school_database`;
  5. И удаляем его. mysql> alter table `class` drop foreign key `class_ibfk_1`;
  6. Ключ удалён.
Запись опубликована автором Михаил Наумов в рубрике MySQL с метками mysql. Добавьте в закладки постоянную ссылку.

mnaumov.com

Удаление значительного числа строк из большой таблицы MySQL

Если у вас большая таблица (скажем, 10+ млн.строк), то удаление значительной части строк (скажем, 20+%) из нее может стать проблемой.
  1. Во-первых, эта операция будет занимать длительное время и некоторые операции на выборку/модификацию данных в эту таблицу все это время нельзя будет произвести.
  2. Во-вторых, удаление строк не освободит место на диске.

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

  1. создать клон таблицы:

    create table <new_table> like <old_table>

  2. запомнить максимальный id в старой таблице:

    select max(id) from <old_table>Записываем на лист бумаги ;-)

  3. переставить id (автоинкрементный) в новой таблице на это max(id) + запас (скажем +2 миллиона):

    ALTER TABLE <new_table> AUTO_INCREMENT=<old_value>+2000000

    Запас нужно выбирать исходя из того, сколько записей может быть вставлено за то время, пока вы делаете операцию. Помножив оценку на 10 - будет в самый раз.

  4. скопировать данные, которые мы хотим оставить из старой таблицы в новую (ниже опишу еще пару трюков)

    insert into <new_table> select * from <old_table> where ...

  5. переименовать обе таблицы:

    RENAME TABLE <old_table> TO <very_old_table>, <new_table> TO <old_table>

    Да, можно делать переименование двух таблиц за одну операцию.

  6. проверить, что максимальные ID в обеих таблицах совпадают. Если не совпадают, докопировать недостающие записи из старой таблицы в новую:

    insert into <new_table> select * from <old_table> where ... and id > <max(id)><max(id)> берем из второго шага.

  7. удалить старую таблицу

    drop table <very_old_table>

Обещал пару трюков к шагу 4:

Что делать, если условие по определению хороших или плохих строк очень сложное? Можно отдельными запросами сохранить хорошие или плохие ID в отдельную таблицу (с одним полем ID). А потом при-JOIN-ить эту таблицу к нашему селекту.

Для хороших:

insert into <new_table> select * from <old_table> join <good_ids> on <old_table>.id=<good_ids>.id

Для плохих:

insert into <new_table> select * from <old_table> left join <good_table> on <old_table>.id=<bad_ids>.id where <bad_ids>.id is NULL

Чтобы JOIN'илось быстро, следует по колонке id в таблице good/bad_ids построить индекс.

alex-ruzin.blogspot.ru

Полезные команды MySQL « Gentoo Way

MySQL
Авторизация на сервере (из консоли), -h при необходимости авторизации на удалённом сервере

mysql -h hostname -u root -p

Создание БД

mysql> create database `databasename`;

Создание БД с указанием необходимой кодировки

mysql> create database `databasename` default character set 'utf8' collate 'utf8_unicode_ci';

Получить список всех БД на сервере
Переключится на БД
Получить список таблиц в базе
Посмотреть структуру таблицы

mysql> describe `table name`;

Ещё один вариант

mysql> show columns from `table name`;

Удалить БД

mysql> drop database `database name`;

Удалить таблицу

mysql> drop table `table name`;

Показать все данные в таблице

mysql> SELECT * FROM `table name`;

Показать строки, где поле `field name` имеет значение "whatever".

mysql> SELECT * FROM `table name` WHERE `field name` = 'whatever';

Показать строки с именем "Bob" и номеном "3444444"

mysql> SELECT * FROM `table name` WHERE name = 'Bob' AND phone_number = 3444444;

Показать строки с номером "3444444" не содержащие имени "Bob" отсортированные по номеру.

mysql> SELECT * FROM `table name` WHERE name != 'Bob' AND phone_number = 3444444 order by phone_number;

Показать записи с именем, начинающимся на "bob" и номером 3444444

mysql> SELECT * FROM `table name` WHERE name like 'Bob%' AND phone_number = 3444444;

Верннуть все данные с именем, начинающемся на "bob" и номером 3444444 ограничить вывод пятью первыми строками

mysql> SELECT * FROM `table name` WHERE name like 'Bob%' AND phone_number = 3444444 limit 0,5;

Используем регулярное выражение. Для регистрозависимого выбора используйте "REGEXP BINARY". Данный запрос найдёт все записи, начинающиеся на "a"

mysql> SELECT * FROM `table name` WHERE rec RLIKE '^a';

Показать уникальные записи

mysql> SELECT DISTINCT `column name` FROM `table name`;

Показать выбранные колонки отсортированные от а до я (ASC) или от я до а (DESC)

mysql> SELECT `col1`,`col2` FROM `table name` ORDER BY `col2` DESC;

Вернуть количество строк в таблице.

mysql> SELECT COUNT(*) FROM `table name`;

Просуммировать все числовые поля таблицы

mysql> SELECT SUM(*) FROM `table name`;

Объединение таблиц. Как работает JOIN (в картинках)

mysql> select lookup.illustrationid, lookup.personid,person.birthday from lookup left join person on lookup.personid=person.personid=statement to join birthday in person table with primary illustration id;

Создание пользователя. Вход под root. Переключение на БД mysql. Создание пользователя и обновление привилегий.

mysql> use mysql;mysql> INSERT INTO user (Host,User,Password) VALUES('%','username',PASSWORD('password'));mysql> flush privileges;

Смена пароля пользователя из консоли

mysqladmin -u username -h hostname -p password 'new-password'

Смена пароля пользователя из консоли MySQL. Вход как root. Смена пароля. Обновление привелегий.

mysql> SET PASSWORD FOR 'user'@'hostname' = PASSWORD('passwordhere');mysql> flush privileges;

Восстановление пароля root пользователя. Остановить MySQL сервер. Запустить с пониженной безопасностью. Залогинится на MySQL как root. Установить новый пароль. Разлогинится и перезапустить MySQL сервер.

/etc/init.d/mysql stopmysqld_safe --skip-grant-tables &amp;mysql -u root

mysql> use mysql;mysql> update user set password=PASSWORD('newrootpassword') where User='root';mysql> flush privileges;mysql> quit

/etc/init.d/mysql stop/etc/init.d/mysql start

Установка пароля root если он ещё не задавался ранее

mysqladmin -u root password newpassword

Смена пароля root

mysqladmin -u root -p oldpassword newpassword

Разрешить пользователю "Bob" подключаться к серверу c локального адреса с паролем "passwd". Войти как root. Переключиться на БД mysql. Дать привилегии. Обновить привелегии.

mysql> use mysql;mysql> grant usage on *.* to bob@localhost identified by 'passwd';mysql> flush privileges;

Предоставить пользователю привилегии на БД. Авторизоваться как root. Переключиться на БД mysql. Предоставить привилегии. Обновить кеш привилегий.

mysql> use mysql;mysql> INSERT INTO user (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('%','databasename','username','Y','Y','Y','Y','Y','N');mysql> flush privileges;

или

mysql> grant all privileges on databasename.* to username@localhost;mysql> flush privileges;

Обновить информацию для существующего пользователя

mysql> use mysql;mysql> UPDATE `user` SET Select_priv = 'Y',Insert_priv = 'Y',Update_priv = 'Y' where `User` = 'user';flush privileges;

Удалить строки из таблицы

mysql> DELETE from `table name` where `field_name` = 'whatever';

Обновить кеш привилегий
Удалить колонку из таблицы

mysql> alter table `table name` drop column `column name`;

Добавить колонку в таблицу

mysql> alter table `table name` add column `new column name` varchar (20);

Переименовать колонку

mysql> alter table `table name` change `old column name` `new column name` varchar (50);

Сделать данные в колоке уникальными (если дублирующиеся уже есть - будет ошибка)

mysql> alter table `table name` add unique (`column name`);

Модифицировать колонку

mysql> alter table `table name` modify `column name` VARCHAR(3);

Удалить индекс

mysql> alter table `table name` drop index `colmn name`;

Загрузить данные в БД из CSV файла.

mysql> LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE `table name` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);

Сделать дамп всех БД для бэкапа. Бэкап это файл с SQL командами для воссоздания всех баз.

mysqldump -u root -p --opt > /tmp/alldatabases.sql

Сделать дамп одной базы.

mysqldump -u username -p --databases databasename > /tmp/databasename.sql

Сделать дамп одной таблицы

mysqldump -c -u username -p databasename tablename > /tmp/databasename.tablename.sql

Восстановить БД (или таблицу) из бэкапа

mysql -u username -p databasename &lt; /tmp/databasename.sql

Создание таблицы, пример 1.

mysql> CREATE TABLE `table name` ( `firstname` VARCHAR(20), `middleinitial` VARCHAR(3), `lastname` VARCHAR(35), `suffix` VARCHAR(3), `officeid` VARCHAR(10), `userid` VARCHAR(15), `username` VARCHAR(8), `email` VARCHAR(35), `phone` VARCHAR(25), `groups` VARCHAR(15), `datestamp` DATE, `timestamp` time, `pgpemail` VARCHAR(255));

Создание таблицы, пример 2.

mysql> CREATE TABLE `table name` ( personid int(50) not null auto_increment primary key, firstname VARCHAR(35), middlename VARCHAR(50), lastname VARCHAR(50) default 'bato');

gentooway.ru