[sql] Вопросы по БД

Discussion in 'PHP' started by FraiDex, 25 Feb 2008.

Thread Status:
Not open for further replies.
  1. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    при восстановлении из backup иногда не сохраняется атрибут auto_increment у полей и нужно вручную через phpmyadmin его восстановить.
     
  2. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    ппц, при чём тут префиксы таблиц??

    Таблица уже существует. Если ыт поверх ставишь то это зря, полностью очисти базу от всех таблиц а уж потом ставь бекап)

    ну это какбэ из-за авто_инкремента. Нужно снимать галочку Авто_инкремента при дампе, чтобы не гемороиться....а вносить comment_ID лучше NULL, хотя не принципиально. По идее в твоём случае нужно дописать в конец запроса (создания таблицы) AUTO_INCREMENT=2.
    Может я уже чё-то не то говорю, 3 часа ночи)) Поправьте если чё)

    Никогда такого не замечал честно говоря)
     
    #342 .:EnoT:., 20 Nov 2008
    Last edited: 20 Nov 2008
  3. Zyklonss

    Zyklonss New Member

    Joined:
    19 Nov 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Жаль, что не имею возможности прикрепить картинку базы. Сейчас у меня общий вид старой и новой базы имеют вид:

    ourwater151 (18)
    ss_comments
    ss_links
    ss_options
    ss_postmeta
    ss_posts
    ss_terms
    ss_term_relationships
    ss_term_taxonomy
    ss_usermeta
    ss_users
    wp_links
    wp_options
    wp_postmeta
    wp_terms
    wp_term_relationships
    wp_term_taxonomy
    wp_usermeta
    wp_users


    Старая база- wp_
    Новая- ss_
    Я уже каким то чудесным образом перенёс данные старой базы wp_comments в ss_comments и wp_posts в ss_posts. Данные в новую базу перенеслись успешно. Делалось это не с помощью бэкапа, а при помощи колдовства с вкладкой "Операции". Подсказал один человек: сразу перенёс эти данные, а остальные решил перенести попожжа и после, как не пытался сделать то же самое, так и не получилось. Видно что-то подзабыл, хотя вроде многие варианты проверил на свой страх и риск.
    Сейчас я на блоге имею все свои посты и комменты. Их пока не много, но всё же.
    Вы советуете удалить нафиг эту старую базу wp_ и уже работать с новой ss_?
    Или Вы советуете оставить только базу ss_, очистить её и уже после делать бэкап? А сохраняться ли посты и комменты? Естесственно буду экспериментировать, так что советуйте.
    Но как же я перенёс данные без бэкапа?
    Если останется только одна база- то необходимо сразу же сделать бэкап:
    1. Снять галочку "Добавить AUTO_INCREMENT"
    2. Вы имеете ввиду строчку в дампе :
    "`comment_ID` bigint(20) unsigned NOT NULL auto_increment,"? Что в ней изменить?
    3. Во всех строках типа: ") ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=38 "- изменять значения на 2? Это обязательно для создания файла бэкапа?
    4. По совету, я при создании файла бэкапа ставил галочку в :"Добавить CREATE PROCEDURE / FUNCTION" и не ставил галку в :"Сохранить как файл". С
    Сохранять обязательно в UTF8?
    Очень много написал, может что не в тему, но так хочется разобраться, что бы в будущем не делать ошибок и не тормозить неделю- две с одним вопросом.
    Спасибо Всем помогающим!
     
    #343 Zyklonss, 20 Nov 2008
    Last edited: 20 Nov 2008
  4. N19hTW0lF

    N19hTW0lF Elder - Старейшина

    Joined:
    11 Jul 2007
    Messages:
    188
    Likes Received:
    140
    Reputations:
    4
    как сделать поиск по бд не как where.../
    я хочу чтобы проверялось если такое слово или нет.если есть то показать
    по бд а не таблица
     
  5. procedure

    procedure Elder - Старейшина

    Joined:
    22 Dec 2007
    Messages:
    527
    Likes Received:
    257
    Reputations:
    46
    Подскажите где можно выполнить данный запрос:
    Code:
    SET TERM ^;
    CREATE PROCEDURE DeleteEmp (pEmpID INTEGER)
    AS BEGIN
      DELETE FROM STAFF
      WHERE ID = :pEmpID;
    END^
    Если InterBase тупит, просит лицензию. (Синтаксис InterBase).
    Что в MS Office Access что в Database Tour пишет:
    Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

    Хотя в Database Tour выставляю синтаксис InterBase 6.
     
    #345 procedure, 21 Nov 2008
    Last edited: 21 Nov 2008
  6. spamoney

    spamoney Elder - Старейшина

    Joined:
    26 Dec 2006
    Messages:
    120
    Likes Received:
    7
    Reputations:
    1
    Добрый День! Помогите пожалуйста с таким вопросом:

    Можно ли как нибудь оптимизировать/упростить этот запрос (возможно его стоит разбить на несколько запросов?), что бы увеличить скорость выполнения:

    Code:
    SELECT sid, s.catid, s.aid, s.title, s.time, s.hometext, s.bodytext, s.comments, s.counter, s.topic, s.acomm, s.score, s.ratings, c.title, t.topicid, t.topicname, t.topicimage, t.topictext, z.id, z.kwords, z.sslka, z.mname FROM prefix_table1 AS s LEFT JOIN prefix_table2  AS c on (s.catid=c.catid) LEFT JOIN prefix_table3 AS z on (sid=z.nid) LEFT JOIN prefix_table4 AS t on (s.topic=t.topicid) WHERE ihome='0' AND s.time <= NOW() AND status='1' AND (alanguage='russian' OR alanguage='') ORDER BY s.time DESC LIMIT 0, 10
     
  7. scarm

    scarm Elder - Старейшина

    Joined:
    4 Apr 2008
    Messages:
    74
    Likes Received:
    48
    Reputations:
    9
    Помогите правильно сформулировать запрос с двумя условиями where
    Code:
    select list from base_user WHERE LENGTH(`list`) = 20
    
    это работает, если ввожу дополнительное условие, для значения строки с именем id1 с типом tinyint(4) и с возможными значениями 0/1, чтобы выводились только строки где id1=0
    Code:
    select list from base_user WHERE LENGTH(`list`) = 20 WHERE (id1)=0
    
    , то в ответ не получаю ничего. Как правильно?
     
  8. spamoney

    spamoney Elder - Старейшина

    Joined:
    26 Dec 2006
    Messages:
    120
    Likes Received:
    7
    Reputations:
    1
    Может так:

    Code:
    SELECT list FROM base_user WHERE LENGTH(`list`) = 20 AND  (id1)=0
     
    1 person likes this.
  9. scarm

    scarm Elder - Старейшина

    Joined:
    4 Apr 2008
    Messages:
    74
    Likes Received:
    48
    Reputations:
    9
    точно :) спс большое :)))
     
  10. truelamer

    truelamer Elder - Старейшина

    Joined:
    6 Nov 2007
    Messages:
    135
    Likes Received:
    30
    Reputations:
    5
    Реконструирую БД. Необходимо найти решение следующей проблемы. БД полна информации, мне необходимо разбить одну таблицу на две, чтоб некоторые столбцы остались в одной другие в другой. Дело в том что таблица которую я хочу упростить содержит 70000 записей. как это можно сделать
     
  11. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Сделать дамп таблицы через phpmyadmin, создать новую таблицу с нужными условиями на основе дампа, сделать процедуру вставки в новую таблицу старых данных на основании новых условий, вставить данные, удалить старую таблицу, переименовать новую таблицу как старую, изменить те участки кода в двиге, где происходит обращение к полям из этой таблицы. Всё
     
  12. truelamer

    truelamer Elder - Старейшина

    Joined:
    6 Nov 2007
    Messages:
    135
    Likes Received:
    30
    Reputations:
    5
    ясен красен что так можно. Дампить не вариант, надо прям на сервере что-то сделать. А как? Писать скрипт которыйе будет селектить из старой и инсертить в новыю таблицу, но тогда сервак умерет от 70000 инсертов
     
  13. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    А по другому никак. Чтобы не умер - делай паузу в 10 секунд например перед каждым апдейтом. Через денек всё и пропишется
     
  14. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    На самом деле никаких сложных процедур и скриптов создавать не надо, решение довольно простое, используются лишь штатные средства MySQL.
    Итак, сперва получаем структуру исходной таблицы. Допустим, это таблица accounts:
    Code:
    mysql> SHOW CREATE TABLE accounts;
    
    CREATE TABLE `accounts` (
      `account_id` bigint(255) default '0',
      `affiliate_id` bigint(255) default '0',
      `site_handle` varchar(255) default NULL,
      `default_address` varchar(255) default NULL,
      `email` varchar(255) default NULL,
      `firstname` varchar(255) default NULL,
      `password` varchar(255) default NULL,
      `send_announcements` int(2) default '0',
      `ip_address` varchar(255) default NULL,
      `is_active` int(2) default '0',
      `is_affiliate` int(2) default '0',
      `last_modified` varchar(255) default NULL,
      `last_loggedin` varchar(255) default NULL,
      `last_updated` varchar(255) default NULL,
      `time_created` varchar(255) default NULL,
      UNIQUE KEY `account_id` (`account_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    Теперь создаем новую таблицу с измененной структурой на основе исходной таблицы:
    Code:
    mysql>CREATE TABLE `accounts2` (
      `account_id` bigint(255) default '0',
      `is_active` int(2) default '0',
      `is_affiliate` int(2) default '0',
      `last_modified` varchar(255) default NULL,
      `last_loggedin` varchar(255) default NULL,
      `last_updated` varchar(255) default NULL,
      `time_created` varchar(255) default NULL,
      UNIQUE KEY `account_id` (`account_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    Замечу, что у таблиц должен быть один общий столбец, иначе связь между ними нарушится, в данном случае это account_id.
    Теперь переносим данные из первой таблицы во вторую:
    Code:
    mysql> INSERT INTO accounts2 (account_id,is_active,is_affiliate,last_modified,la
    st_loggedin,last_updated,time_created) SELECT account_id,is_active,is_affiliate,
    last_modified,last_loggedin,last_updated,time_created FROM accounts LIMIT 5000
        -> ;
    Query OK, 5000 rows affected (0.27 sec)
    Records: 5000  Duplicates: 0  Warnings: 0
    Когда будешь разбивать таблицу, LIMIT нужно, конечно, убрать.
    Теперь осталось лишь удалить ненужные столбцы из первой таблицы:
    Code:
    ALTER TABLE `accounts` DROP COLUMN `affiliate_id`, DROP COLUMN `site_handle`, DROP COLUMN `default_address`;
    ...
    
     
    #354 [Raz0r], 22 Nov 2008
    Last edited: 22 Nov 2008
    1 person likes this.
  15. truelamer

    truelamer Elder - Старейшина

    Joined:
    6 Nov 2007
    Messages:
    135
    Likes Received:
    30
    Reputations:
    5
    а сервак такими процедурами не нагружу? ведь у меня там 70000 записей.
     
  16. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    смотря какой сервак, вообще 70к для MySQL не так уж и много
     
  17. Zyklonss

    Zyklonss New Member

    Joined:
    19 Nov 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Спасибо Всем, кто помогал советом в моём вопросе. С Вашей помощью и с помощью собственного мышления начал догонять по теме. Начал понимать суть базы данных, дампа данных. Уже поигрался с очисткой таблиц и вставкой данных из дампа. Всё- ок.
    Спасибо Всем.
     
  18. truelamer

    truelamer Elder - Старейшина

    Joined:
    6 Nov 2007
    Messages:
    135
    Likes Received:
    30
    Reputations:
    5
    Есть у ког-нить что-нить по mysql почитать с примерами? Пмеры выборок инсертов итп. Чтоб грамотоно бд использовать
     
  19. warlok

    warlok Elder - Старейшина

    Joined:
    17 Feb 2008
    Messages:
    328
    Likes Received:
    142
    Reputations:
    81
    truelamer
    http://www.mysql.ru/docs/ имхо лучше не придумать
     
    1 person likes this.
  20. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    sql-ex.ru :) Не сочтите за рекламу - но действительно очень помогает :D
     
    1 person likes this.
Thread Status:
Not open for further replies.