Bir işlemdeki bir veritabanındaki tüm tabloları kısaltmak için bir sorgu (komut) var mı? Bunu tek bir sorgu ile yapabilir miyim bilmek istiyorum.
Bir işlemdeki bir veritabanındaki tüm tabloları kısaltmak için bir sorgu (komut) var mı? Bunu tek bir sorgu ile yapabilir miyim bilmek istiyorum.
Yanıtlar:
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
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Mysql örneğinde birden çok veritabanı tablosunu kesme
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('db1_name','db2_name');
Tabloları kısaltmak için Sorgu Sonucu'nu kullanma
Not: belki bu hatayı alırsınız:
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
Bu, bırakmaya / kesmeye çalıştığınız tabloya yabancı anahtar başvuruları içeren tablolar varsa olur.
Tabloları kesmeden önce Tek yapmanız gereken:
SET FOREIGN_KEY_CHECKS=0;
Tablolarınızı kısaltın ve tekrar
SET FOREIGN_KEY_CHECKS=1;
PhpMyAdmin'i şu şekilde kullanın:
Veritabanı Görünümü => Tümünü Kontrol Et (tablolar) => Boş
Yabancı anahtar kontrollerini yoksaymak istiyorsanız, şu kutunun işaretini kaldırabilirsiniz:
[] Yabancı anahtar kontrollerini etkinleştir
Bu onay kutusunu almak için en az 4.5.0 veya daha yeni bir sürümü çalıştırmanız gerekir.
MySQL CLI-fu değil, ama hey, işe yarıyor!
MS SQL Server 2005+ (Gerçek yürütme için PRINT'i kaldır ...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
Veritabanı platformunuz BİLGİ_SCHEMA görünümlerini destekliyorsa, aşağıdaki sorgunun sonuçlarını alın ve yürütün.
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
MySQL için şunu deneyin:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
Concat'a noktalı virgül eklemek, örneğin mysql çalışma tezgahından kullanmayı kolaylaştırır.
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
Bir veritabanındaki tüm tabloları bırakmak için buldum:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME
Barındırma çözümü ile sınırlıysanız (tüm veritabanını bırakamazsanız) yararlıdır.
Tabloları kısaltmak için değiştirdim. Hiçbir "- add-truncate-table" mysqldump için, bu yüzden yaptım:
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
benim için çalışıyor - edit, son komutta bir yazım hatasını düzeltiyor
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
:AND table_schema = DATABASE();
Sadece aşağıdaki kod gibi bir şey yapmak en basit buldum, sadece tablo isimlerini kendi ile değiştirin. önemli Son satırın daima SET FOREIGN_KEY_CHECKS = 1 olduğundan emin olun;
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
Bu, tüm tabloları kısaltmak için komutu yazdırır:
SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
Veri kesme işlemi yapıldıktan sonra, aynı yabancı anahtar kısıtlamalarını aynı tabloda tekrar oluşturun. Yukarıdaki işlemleri gerçekleştirmek için komut dosyasını oluşturacak bir komut dosyasının aşağısına bakın.
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';
Şimdi, oluşturulan Db Truncate.sql komut dosyasını çalıştırın
Yararları. 1) Disk alanını geri kazanın 2) DB / Şemayı aynı yapıda bırakmak ve yeniden oluşturmak gerekmez
Dezavantajları. 1) FK kısıtlamaları, tablodaki sınırlama adında 'FK' adının bulunduğu adlar olmalıdır.
sql server 2005 kullanıyorsanız, bir veritabanındaki tüm tablolara karşı bir komut veya komut kümesi yürütmenizi sağlayan gizli bir saklı yordam vardır. TRUNCATE TABLE
Bu saklı yordam ile nasıl arayacağınız aşağıda açıklanmıştır :
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
İşte daha ayrıntılı olarak hazırlanmış iyi bir makale.
Bununla birlikte, MySql için, mysqldump kullanabilir ve verileri görmezden gelen tüm tabloları bırakmak ve oluşturmak için --add-drop-tables
ve --no-data
seçeneklerini belirtebilirsiniz . bunun gibi:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
Bunu kullanın ve sorguyu oluşturun
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';
Şimdi bu sorguyu kullanmak için bunu kullanın
mysql -u username -p </path/to/file.sql
böyle bir hata alırsan
ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint
geçmenin en kolay yolu dosyanızın en üstünde bu satırı ekleyin
SET FOREIGN_KEY_CHECKS=0;
yani bu dosyadan geçerken yabancı anahtar kısıtlamalarını kontrol etmek istemiyoruz.
Db1 ve bd2 veritabanlarındaki tüm tabloları kesecektir.
Hayır. Tüm mysql tablolarını aynı anda kısaltmak için tek bir komut yoktur. Tabloları tek tek kesmek için küçük bir komut dosyası oluşturmanız gerekir.
ref: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
İşte benim varyantı 'hepsini hepsini kısaltmak için bir ifadeye' sahip olmak.
İlk olarak, yardımcı saklı yordamlar için 'util' adlı ayrı bir veritabanı kullanıyorum. Tüm tabloları kısaltmak için saklı yordamın kodu:
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 ;
Bu saklı yordamı util veritabanınızda aldıktan sonra, şöyle çağırabilirsiniz
call util.trunctables('nameofdatabase');
hangi şimdi tam olarak bir ifade :-)
burada biliyorum burada
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename1','databasename2');
Bir üst satırı silemez veya güncelleyemezse: yabancı anahtar kısıtlaması başarısız olur
Bu, bırakmaya / kesmeye çalıştığınız tabloya yabancı anahtar başvuruları içeren tablolar varsa olur.
Tabloları kesmeden önce Tek yapmanız gereken:
SET FOREIGN_KEY_CHECKS=0;
Tablolarınızı kısaltın ve tekrar
SET FOREIGN_KEY_CHECKS=1;
bu php kodunu kullan
$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']);
}
?>
detayı buradan kontrol et link
İşte yerel veritabanındaki tüm tabloları kısaltan bir yordam.
Çalışmıyorsa bana bildirin, bu cevabı sileceğim.
Test edilmemiş
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;
TRUNCATE TABLE .. bir NOCHECK CONSTRAINT ALL sonra bile, yabancı anahtar kısıtlamaları ile ilgili sorun olduğunu, bu yüzden bunun yerine bir DELETE FROM deyimi kullanın. Bu, kimlik tohumlarının sıfırlanmadığı anlamına gelir, bunu başarmak için her zaman bir DBCC CHECKIDENT ekleyebilirsiniz.
I Çalıştırmadan önce veritabanındaki tüm tabloları kesmek için sql mesaj penceresine yazdırmak için aşağıdaki kodu kullanın. Bir hata yapmayı biraz zorlaştırıyor.
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'''
Emin değilim ama ben veritabanı şemasını yeni veritabanına kopyalayabilirsiniz kullanarak bir komut olduğunu düşünüyorum, bunu yaptıktan sonra eski veritabanını silebilirsiniz ve bundan sonra tekrar eski veritabanı veritabanı şemasını kopyalayabilirsiniz.
Bu tam olarak bir komut olmadığını biliyorum, ancak phpMyAdmin içinde istenen sonuç aşağıdaki adımları izleyerek elde edilebilir:
Fikir, tüm tabloları hızlı bir şekilde veritabanından (5 saniye ve 2 tıklama ile yaptığınız) almak, ancak önce yabancı anahtar kontrollerini devre dışı bırakmaktır. Hiçbir CLI ve hiçbir veritabanı bırakarak ve tekrar ekleme.
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,
Kodu biçimlendirmek için zaman ayırdığınız için teşekkür ederiz, ancak bu şekilde uygulanması gerekiyordu.
-Kurt
UNIX veya Linux kutusunda:
Bir bash kabuğunda olduğunuzdan emin olun. Bu komutlar, komut satırından aşağıdaki gibi çalıştırılmalıdır.
Not:
Kimlik bilgilerimi ~ / .my.cnf dosyamda saklıyorum, bu yüzden bunları komut satırında sağlamam gerekmiyor.
Not:
cpm veritabanı adıdır
Her komuttan elde edilen sonuçların sadece küçük bir örneğini gösteriyorum.
Yabancı anahtar kısıtlamalarınızı bulun:
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"
Tabloları ve satır sayılarını listeleyin:
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
Tablolarınızı kısaltın:
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
Çalıştığını doğrulayın:
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 kutusunda:
NOT:
cpm veritabanı adıdır
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
Aşağıdaki MySQL sorgusu, belirli bir veritabanındaki tüm tabloları kesecek tek bir sorgu üretir. YABANCI tuşları atlar:
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
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
-- Düzenle ----
earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
Bir fikir sadece tabloları bırakmak ve yeniden oluşturmak olabilir mi?
DÜZENLE:
@Jonathan Leffler: Doğru
Diğer Öneri (veya TÜM tabloları kısaltmanız gerekmediği durumda):
Neden yalnızca belirli tabloları kısaltmak için temel bir saklı yordam oluşturmuyorsunuz?
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
<?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();
?>
İşte bir tablo temizlemek için kullandığınız kod snippet'i. $ Conn bilgisini ve TABLE_NAME öğesini değiştirmeniz yeterli.