Mysql menyalin indeks dari satu tabel ke tabel lainnya

Saya perlu menyalin indeks dari satu tabel ke tabel lainnya. Ada BANYAK indeks dan saya tidak ingin membuatnya kembali dari awal. Sepertinya rawan kesalahan

Saya telah menyalin struktur menggunakan

SELECT * INTO [BackupTable] FROM [OriginalTable]

Tapi itu tidak menyalin indeks, batasan, pemicu, dll

Apakah ada yang tahu bagaimana melakukan ini?

Solusi terbaik

Apakah Anda ingin menyalin definisi Indeks?

Kemudian Anda dapat merekayasa balik indeks, pemicu, dll menggunakan opsi "Skrip" di alat Manajemen Microsoft SQL

Cukup klik kanan pada nama tabel di daftar tabel SQL Management Studio dan pilih "Script Table as" lalu "Create to"

Anda tidak dapat menyalin data Indeks karena terkait dengan penyimpanan fisik Indeks

Pertama, periksa apakah Anda memiliki "Tools/Options/SQL Server Object Explorer/Scripting/Script Indexes" disetel ke "True". Ini disetel ke false di beberapa versi alat Manajemen SQL (terima kasih Mark)

Mysql menyalin indeks dari satu tabel ke tabel lainnya

Solusi Terkait

Php – Cara mencegah injeksi SQL di PHP

Cara yang benar untuk menghindari serangan injeksi SQL, terlepas dari basis data mana yang Anda gunakan, adalah dengan memisahkan data dari SQL, sehingga data tetap menjadi data dan tidak akan pernah ditafsirkan sebagai perintah oleh parser SQL. Dimungkinkan untuk membuat pernyataan SQL dengan bagian data yang diformat dengan benar, tetapi jika Anda tidak sepenuhnya memahami detailnya, Anda harus selalu menggunakan pernyataan yang disiapkan dan kueri berparameter. Ini adalah pernyataan SQL yang dikirim ke dan diuraikan oleh server database secara terpisah dari parameter apa pun. Dengan cara ini, penyerang tidak mungkin menyuntikkan SQL berbahaya

Anda pada dasarnya memiliki dua opsi untuk mencapai ini

  1. Menggunakan PDO (untuk semua driver database yang didukung)

     $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    
     $stmt->execute([ 'name' => $name ]);
    
     foreach ($stmt as $row) {
         // Do something with $row
     }
    
    _
  2. Menggunakan MySQLi (untuk MySQL)

     $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
     $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
    
     $stmt->execute();
    
     $result = $stmt->get_result();
     while ($row = $result->fetch_assoc()) {
         // Do something with $row
     }
    

Jika Anda terhubung ke database selain MySQL, ada opsi kedua khusus driver yang dapat Anda rujuk (misalnya, pg_prepare() dan pg_execute() untuk PostgreSQL). PDO adalah opsi universal


Menyiapkan koneksi dengan benar

Perhatikan bahwa saat menggunakan PDO untuk mengakses database MySQL, pernyataan yang sebenarnya disiapkan tidak digunakan secara default. Untuk memperbaikinya, Anda harus menonaktifkan emulasi pernyataan yang disiapkan. Contoh membuat koneksi menggunakan PDO adalah

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Dalam contoh di atas, mode kesalahan tidak sepenuhnya diperlukan, tetapi disarankan untuk menambahkannya. Dengan cara ini skrip tidak akan berhenti dengan

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
0 ketika terjadi kesalahan. Dan itu memberi pengembang kesempatan untuk
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
_1 kesalahan apa pun yang
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
2n sebagai
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
3s

Apa yang wajib, bagaimanapun, adalah baris

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
_4 pertama, yang memberi tahu PDO untuk menonaktifkan pernyataan siap yang ditiru dan menggunakan pernyataan nyata yang disiapkan. Ini memastikan pernyataan dan nilai tidak diurai oleh PHP sebelum mengirimkannya ke server MySQL (memberikan kemungkinan penyerang tidak memiliki kesempatan untuk menyuntikkan SQL berbahaya)

Meskipun Anda dapat menyetel

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
_5 dalam opsi konstruktor, penting untuk dicatat bahwa versi 'lama' PHP (sebelum 5. 3. 6) diam-diam mengabaikan parameter charset di DSN


Penjelasan

Pernyataan SQL yang Anda berikan ke

 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
_6 diuraikan dan dikompilasi oleh server database. Dengan menentukan parameter (baik
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
_7 atau parameter bernama seperti
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
8 pada contoh di atas) Anda memberi tahu mesin basis data tempat Anda ingin memfilter. Kemudian saat Anda memanggil
 $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

 $stmt->execute([ 'name' => $name ]);

 foreach ($stmt as $row) {
     // Do something with $row
 }
_9, pernyataan yang disiapkan digabungkan dengan nilai parameter yang Anda tentukan

Yang penting di sini adalah nilai parameter digabungkan dengan pernyataan yang dikompilasi, bukan string SQL. Injeksi SQL bekerja dengan mengelabui skrip agar memasukkan string berbahaya saat membuat SQL untuk dikirim ke database. Jadi dengan mengirimkan SQL aktual secara terpisah dari parameter, Anda membatasi risiko berakhir dengan sesuatu yang tidak Anda inginkan

Parameter apa pun yang Anda kirim saat menggunakan pernyataan yang disiapkan hanya akan diperlakukan sebagai string (walaupun mesin basis data dapat melakukan beberapa pengoptimalan sehingga parameter dapat berakhir sebagai angka juga, tentu saja). Dalam contoh di atas, jika variabel

 $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
 $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'

 $stmt->execute();

 $result = $stmt->get_result();
 while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
_0 berisi
 $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
 $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'

 $stmt->execute();

 $result = $stmt->get_result();
 while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
1 hasilnya hanya akan mencari string
 $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
 $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'

 $stmt->execute();

 $result = $stmt->get_result();
 while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
2, dan Anda tidak akan mendapatkan tabel kosong

Manfaat lain menggunakan pernyataan yang telah disiapkan adalah bahwa jika Anda menjalankan pernyataan yang sama berkali-kali dalam sesi yang sama, pernyataan itu hanya akan diuraikan dan dikompilasi sekali, memberi Anda beberapa peningkatan kecepatan

Oh, dan karena Anda bertanya tentang cara melakukannya untuk penyisipan, inilah contohnya (menggunakan PDO)

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute([ 'column' => $unsafeValue ]);

Bisakah pernyataan yang disiapkan digunakan untuk kueri dinamis?

Meskipun Anda masih dapat menggunakan pernyataan yang telah disiapkan untuk parameter kueri, struktur kueri dinamis itu sendiri tidak dapat diparametrikan dan fitur kueri tertentu tidak dapat diparametrikan

Untuk skenario khusus ini, hal terbaik untuk dilakukan adalah menggunakan filter daftar putih yang membatasi kemungkinan nilai

Bagaimana cara menyalin indeks dari satu tabel ke tabel lainnya di MySQL?

Menyalin tabel dari satu database ke database lainnya. Di MySQL, cara termudah untuk menyalin tabel dengan datanya di antara dua database adalah dengan menggunakan pernyataan CREATE TABLE AS , tetapi perhatikan, bahwa Anda perlu . BUAT TABEL nama-database-baru. nama-tabel-baru SEBAGAI PILIH * DARI database-lama.

Bagaimana cara menyalin indeks dari satu tabel ke tabel lainnya?

Langkah 1, buat tabel emp1 di db1. Langkah 2, Salin struktur tabel di db2. Langkah 3, buat prosedur [spCloneDatabaseTableStructure v3] di db1. Langkah 4, jalankan prosedur ini pada db1 .

Bagaimana cara menyalin data dari satu tabel ke tabel lain di MySQL?

Contoh 4. Proses menyalin tabel MySQL untuk mengkloning tabel .
Untuk membuat tabel, gunakan CREATE TABLE destination_table LIKE source_table
Untuk menyalin data, gunakan INSERT INTO destination_table SELECT * FROM source_table

Bagaimana cara menyalin tabel dengan indeks di SQL Server?

BUAT ATAU UBAH PROSEDUR script_index_sp @tblname sysname, @ixname sysname, @ixcmd nvarchar(MAX) OUTPUT AS DECLARE @object_id int = object_id(@tblname), @index_id int SELECT @index_id = index_id FROM sys. indexes WHERE object_id = @object_id AND name = @ixname -- Dapatkan bagian wajib dari definisi indeks