Если вы выполняете единичный тест, вы можете скомпилировать свой файл со следующим флагом
-Dprivate=public
. Затем в вашем модульном тесте вы сможете вызывать все частные методы вашего класса.
EDIT:
Недавно я заметил, что использование флага -fno-access-control в gcc-компиляторе позволяет вам получить доступ к частному методу или члену. Более подробную информацию по этой теме можно найти здесь: Тестирование модуля с помощью -fno-access-control
Soln 1)
mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;
Soln 2)
- Export only structure of a db
- drop the database
- import the .sql of structure
- изменить ----
earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
Вот процедура, которая должна усекать все таблицы в локальной базе данных.
Дайте мне знать, если это не сработает, и я удалю этот ответ.
Untested
CREATE PROCEDURE truncate_all_tables()
BEGIN
-- Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE cmd VARCHAR(2000);
-- Declare the cursor
DECLARE cmds CURSOR
FOR
SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;
-- Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- Open the cursor
OPEN cmds;
-- Loop through all rows
REPEAT
-- Get order number
FETCH cmds INTO cmd;
-- Execute the command
PREPARE stmt FROM cmd;
EXECUTE stmt;
DROP PREPARE stmt;
-- End of loop
UNTIL done END REPEAT;
-- Close the cursor
CLOSE cmds;
END;
Вот мой вариант, чтобы иметь «один оператор для усечения» всех.
Во-первых, я использую отдельную базу данных с именем «util» для моих вспомогательных хранимых процедур. Код моей хранимой процедуры для обрезания всех таблиц:
DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE PROCEDURE trunctables(theDb varchar(64))
BEGIN
declare tname varchar(64);
declare tcursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
SET FOREIGN_KEY_CHECKS = 0;
OPEN tcursor;
l1: LOOP
FETCH tcursor INTO tname;
if tname = NULL then leave l1; end if;
set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
PREPARE stmt from @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP l1;
CLOSE tcursor;
SET FOREIGN_KEY_CHECKS = 1;
END ;;
DELIMITER ;
Как только у вас есть эта хранимая процедура в вашей базе данных util, вы можете называть ее как
call util.trunctables('nameofdatabase');
, которая теперь точно одно утверждение: -)
Мне было проще всего просто сделать что-то вроде кода ниже, просто замените имена таблиц своими. important убедитесь, что последняя строка всегда установлена SET FOREIGN_KEY_CHECKS = 1;
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
Нет. Нет единой команды для обрезания всех таблиц mysql сразу. Вам нужно будет создать небольшой скрипт для обрезания таблиц один за другим.
ref: http://dev.mysql.com/doc/refman/5.0/ru/truncate-table. HTML
Я обнаружил, что TRUNCATE TABLE .. имеет проблемы с ограничениями внешнего ключа, даже после NOCHECK CONSTRAINT ALL, поэтому вместо этого я использую оператор DELETE FROM. Это означает, что семена идентичности не сбрасываются, вы всегда можете добавить DBCC CHECKIDENT для достижения этого.
Я использую следующий код, чтобы распечатать в окне сообщения sql для обрезания всех таблиц в базе данных , прежде чем запускать его. Это просто усложняет ошибку.
EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''
обрезать несколько таблиц базы данных на экземпляре Mysql
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('db1_name','db2_name');
Использовать результат запроса для обрезания таблиц
Примечание: возможно, вы получите эту ошибку:
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
Это происходит, если есть таблицы с внешними ключами, ссылающиеся на таблицу, которую вы пытаетесь удалить / усечь.
Перед усечением таблиц Все, что вам нужно сделать, это:
SET FOREIGN_KEY_CHECKS=0;
Усекайте свои таблицы и измените их на
SET FOREIGN_KEY_CHECKS=1;
Я нашел это, чтобы удалить все таблицы в базе данных:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME
Полезно, если вы ограничены решением для хостинга (не можете удалить всю базу данных).
I изменил его, чтобы обрезать таблицы. Для mysqldump нет «-add-truncate-table», поэтому я сделал:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME
работает для меня --edit, исправление опечатки в последней команде
, если используется SQL Server 2005, существует скрытая хранимая процедура, которая позволяет вам выполнить команду или набор команд для всех таблиц внутри базы данных. Вот как вы могли бы называть TRUNCATE TABLE
этой хранимой процедурой:
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
Здесь - хорошая статья, которая развивается дальше.
Для MySql, однако вы можете использовать mysqldump и указать опции --add-drop-tables
и --no-data
для удаления и создания всех таблиц, игнорирующих данные. например:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");
// check connection
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);
// Print message
if ($sql === TRUE) {
echo 'data delete successfully';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
Вот фрагмент кода, который я использую для очистки таблицы. Просто измените $ conn info и TABLE_NAME.
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
do echo "Truncating table ${i}";
mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
sleep 1;
done
-
David,
Спасибо, что нашли время для форматирования кода, но это то, как он должен применяться.
-Kurt
В ящике UNIX или Linux:
Убедитесь, что вы находитесь в оболочке bash. Эти команды должны запускаться из командной строки следующим образом.
Примечание:
Я храню свои учетные данные в файле ~ / .my.cnf, поэтому мне не нужны
Примечание:
cpm - это имя базы данных
Я показываю только небольшую выборку результатов из каждой команды .
Найдите ограничения внешнего ключа:
klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
from information_schema.referential_constraints
where constraint_schema = 'cpm'
order by referenced_table_name"
Перечислить таблицы и количество строк:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 297
2 approval_external_system 0
3 approval_request 0
4 country 189
5 credential 468
6 customer 6776
7 customer_identification 5631
8 customer_image 2
9 customer_status 13639
Усечь ваши таблицы :
klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
Убедитесь, что она сработала:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 0
2 approval_external_system 0
3 approval_request 0
4 country 0
5 credential 0
6 customer 0
7 customer_identification 0
8 customer_image 0
9 customer_status 0
10 email_address 0
В окне Windows:
ПРИМЕЧАНИЕ:
cpm - это имя базы данных
C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm
Это приведет к печати команды для усечения всех таблиц:
SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
SET FOREIGN_KEY_CHECKS = 0;
SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema IN ('db1_name','db2_name');
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Я не уверен, но я думаю, что есть одна команда, в которой вы можете скопировать схему базы данных в новую базу данных, как только вы это сделаете, вы можете удалить старую базу данных, после чего вы можете снова скопировать схему базы данных в старое имя.
здесь, где я знаю здесь
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename1','databasename2');
Если не удается удалить или обновить родительскую строку: ограничение внешнего ключа не работает
Это происходит, если есть таблицы с внешними ключами, ссылки на таблицу, которую вы пытаетесь удалить / усечь.
Перед усечением таблиц Все, что вам нужно сделать, это:
SET FOREIGN_KEY_CHECKS=0;
Усечь ваши таблицы и изменить их на
SET FOREIGN_KEY_CHECKS=1;
пользователь этот код php
$truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");
while($truncateRow=mysql_fetch_assoc($truncate)){
mysql_query($truncateRow['tables_query']);
}
?>
проверьте подробнее здесь link
Идея может состоять в том, чтобы просто сбросить и воссоздать таблицы?
EDIT:
@Jonathan Leffler: True
Другое предложение (или случай, который вы не делаете необходимо усечь ВСЕ таблицы):
Почему бы просто не создать базовую хранимую процедуру для обрезания определенных таблиц
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
– Ethan P.
25 January 2013 в 20:00
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
– Alexander Shcheblikin
30 November 2013 в 00:04
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
UNION
SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
UNION
SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
UNION
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';
Теперь запустите созданный скрипт Db Truncate.sql
. 1) Восстановить дисковое пространство 2) Не требуется, чтобы сбросить и воссоздать DB / Schema с той же структурой
Недостатки. 1) Ограничения FK должны быть именами в таблице с именем, содержащим «FK» в имени ограничения.
Используйте phpMyAdmin следующим образом:
Database View => Проверить все (таблицы) => Пусто
blockquote>Если вы хотите игнорировать проверки внешнего ключа , вы можете снять флажок с надписью:
[] Включить проверку внешнего ключа
blockquote>Вам нужно будет работать atleast версии 4.5.0 или выше чтобы получить этот флажок.
Его не MySQL CLI-fu, но эй, он работает!
Я знаю, что это не совсем одна команда, но желаемый результат может быть достигнут из phpMyAdmin, выполнив следующие шаги:
Идея состоит в том, чтобы быстро получить все таблицы из базы данных (что вы делаете за 5 секунд и 2 клика ), но сначала отключите проверку внешнего ключа. Нет CLI и не отбрасывать базу данных и добавлять ее снова.
Следующий запрос MySQL сам будет вызывать один запрос, который усекает все таблицы в данной базе данных. Он обходит клавиши FOREIGN:
SELECT CONCAT(
'SET FOREIGN_KEY_CHECKS=0; ',
GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
'SET FOREIGN_KEY_CHECKS=1;'
) as dropAllTablesSql
FROM ( SELECT Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'DATABASE_NAME' ) as queries
MS SQL Server 2005+ (удалить PRINT для фактического выполнения ...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
Если ваша платформа базы данных поддерживает представления INFORMATION_SCHEMA, возьмите результаты следующего запроса и выполните их.
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Попробуйте это для MySQL:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
Добавление точки с запятой в Concat упрощает использование, например изнутри workbench mysql.
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
Используйте это и формируйте запрос
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';
Теперь используйте этот метод, чтобы использовать этот запрос
mysql -u username -p </path/to/file.sql
, если вы получите ошибку, подобную этой
ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint
самый простой способ - наверху вашего файла добавить эту строку
SET FOREIGN_KEY_CHECKS=0;
, в которой говорится, что мы не хотим проверять ограничения внешнего ключа во время прохождения этого файла.
Он усечет все таблицы в базах данных db1 и bd2.