DataSets XSD i ignorując kluczy obcych




Mam dość standardowego table set-up w bieżącej aplikacji przy użyciu [.NET](http://en.wikipedia.org/wiki/.NET_Framework)  [XSD](http://en.wikipedia.org/wiki/XML_Schema_%28W3C%29) `DataSet` i `TableAdapter`możliwości. Moja `contracts`tabela składa się z pewnym standardowe informacje o zamówieniu, z kolumną dla osób `primary department`. Ta kolumna jest [klucz obcy](http://en.wikipedia.org/wiki/Foreign_key) do mojego `Departments`stolika, gdzie przechowuje się podstawowych `department name`, `id`, `notes`. To wszystko i funkcjonowania w moim [SQL Server](http://en.wikipedia.org/wiki/Microsoft_SQL_Server) .


Kiedy używać narzędzia XSD, mogę przeciągnąć obu tabel na raz i to auto wykrywa / tworzy klucz obcy Mam pomiędzy tymi dwiema tabelami. Działa to doskonale, kiedy jestem na mojej stronie głównej i jestem przeglądania danych kontraktowych.


Jednak, gdy idę do mojej strony administracyjnej zmodyfikować dane towarowych. I zwykle zrobić coś takiego:



```
Dim dtDepartment As New DepartmentDataTable()
Dim taDepartment As New DepartmentTableAdapter()

taDepartment.Fill(dtDepartment)

```

Jednak w tym momencie jest wyjątek mówiąc o tym, że tam jest klucz obcy odniesienie złamane tu zgaduję, ponieważ nie mają `Contract` `DataTable`wypełniony.


Jak mogę rozwiązać ten problem? Wiem, że można po prostu usunąć klucz obcy z XSD, aby to wszystko działa w porządku, ale z dodatkową kontrolę integralności tam i mając meczu schematu XSD schematu SQL w bazie danych jest miły.
Można spróbować toczenia Zameldowanie ograniczenia off na DataSet (to jego właściwości) lub zmiany właściwości tego związku, i zmienić klucz do prostego odniesienia - do Ciebie.
<p>zrobiliśmy to za pomocą wielu ręcznych skryptów w połączeniu z kreatorem importu, ale dziś rano znalazłem lepszą odpowiedź, dzięki uprzejmości <a href="http://sqlblog.com/blogs/tibor\_karaszi/archive/2008/06/21/import-export-wizard-and-indexes-keys-etc.aspx">artykuł na blogu tibora karasziego</a> .</p><p>częścią naszej frustracji było to, że <strong> sql 2000 </strong> „kreator importu/eksportu dts” sprawia, że ​​jest to prawie banalnie łatwe, wybierając „kopiuj obiekty i dane”:</p><p><img src="https://i.stack.imgur.com/igvdv.png" alt="dts import wizard"></p><p>ta trzecia opcja zawiera opcję włączenia indeksów/wyzwalaczy itp .:</p><p><img src="https://i.stack.imgur.com/ttgjq.png" alt="advanced options"></p><p>ta opcja została <strong> [~ # ~] usunięta [~ # ~] </strong> z <em> sql 2005/2008</em> kreator importu. dlaczego? brak pomysłu:</p><p><img src="https://i.stack.imgur.com/77kwn.png" alt="2008 import wizard"></p><p>w 2005/2008 najwyraźniej musisz <em> ręcznie</em> utworzyć pakiet ssis w bids i użyć <a href="http://www.sql-server-performance.com/articles/dba/transfer\_sql\_objects\_task\_ssis\_p2.aspx">transfer zadań sql server objects</a> , który zawiera wszystkie te same opcje, które były w kreator 2000:</p><p><img src="https://i.stack.imgur.com/m22zs.png" alt="ssis transfer sql server objects task"></p> <p>tak.</p><p>możesz zmienić domyślne sortowanie instancji ekspresowej sql server 2008 r2 i poszczególnych baz danych, ale jest to złożone zadanie.</p><p>niestety nie ma opcji wizualnej, aby to zrobić za pośrednictwem ssms.</p><blockquote> <p><strong> sql server 2008 obsługuje ustawianie sortowania na następujących poziomach: </strong></p> <ul> <li> <p>serwer</p> </li> <li> <p>baza danych</p> </li> <li> <p>kolumna</p> </li> <li> <p>wyrażenie</p> </li> </ul> <p>domyślne ustawienia instalacji są określone przez ustawienia regionalne systemu windows. sortowanie na poziomie serwera można zmienić podczas instalacji lub przez zmianę ustawień regionalnych systemu windows przed instalacją. <a href="http://technet.microsoft.com/en-us/library/ms143508%28sql.100%29.aspx">więcej ...</a> </p> </blockquote><p> <a href="http://technet.microsoft.com/en-us/library/ms179254%28sql.100%29.aspx">stawianie i zmiana sortowania serwerów - sql server 2008</a> </p><ul> <li> <p>upewnij się, że masz wszystkie informacje lub skrypty potrzebne do odtworzenia baz danych użytkowników i wszystkich zawartych w nich obiektów.</p> </li> <li> <p>wyeksportuj wszystkie dane za pomocą narzędzia takiego jak narzędzie bcp. aby uzyskać więcej informacji, zobacz importowanie i eksportowanie danych masowych.</p> </li> <li> <p>usuń wszystkie bazy danych użytkowników.</p> </li> <li> <p> <a href="http://blogs.msdn.com/b/psssql/archive/2008/08/29/how-to-rebuild-system-databases-in-sql-server-2008.aspx">odbuduj główną bazę danych</a> określając nowe sortowanie we właściwości sqlcollation polecenia setup</p> </li> <li> <p>utwórz wszystkie bazy danych i wszystkie zawarte w nich obiekty.</p> </li> <li> <p>zaimportuj wszystkie swoje dane.</p> </li> </ul><p> <a href="http://technet.microsoft.com/en-us/library/ms175835%28sql.100%29.aspx">stawianie i zmiana sortowania bazy danych - sql server 2008</a> </p><ul> <li>ustaw opcję <code>collation</code> w <code>create database</code> instrukcja podczas tworzenia nowej bazy danych.</li> <li> <p>podobnie ustaw opcje <code>collation</code> w <code>alter database</code> instrukcja zmiany sortowania istniejącej bazy danych.</p> <p><code>alter database [database\_name] collate sql\_latin1\_general\_cp1\_ci\_as;</code></p> </li> </ul><p> <a href="http://technet.microsoft.com/en-us/library/ms190920%28sql.100%29.aspx">stawianie i zmiana sortowania kolumn</a> </p><ul> <li>niektóre sortowania kolumn pozostaną takie same, nawet po zmianie sortowania bazy danych. w takim przypadku musisz zmodyfikować zestawienie poszczególnych kolumn.</li> </ul> <p>od <a href="http://msdn.microsoft.com/en-us/library/ms188029.aspx">books online</a> </p><blockquote> <p>format nowej\_tabeli określa się, oceniając wyrażenia na liście wyboru. kolumny w nowej\_tabeli są tworzone w kolejności określonej przez listę wyboru. każda kolumna w tabeli nowa\_ ma taką samą nazwę, typ danych, dopuszczalność nullab i wartość jak odpowiednie wyrażenie na liście wyboru. <strong> właściwość tożsamość kolumny jest przenoszona </strong>, z wyjątkiem warunków określonych w „praca z kolumnami tożsamości” w sekcji uwagi.</p> </blockquote><p>w dół strony:</p><blockquote> <p>po wybraniu istniejącej kolumny tożsamości do nowej tabeli nowa kolumna dziedziczy właściwość tożsamość, chyba że spełniony jest jeden z następujących warunków:</p> <ul> <li>instrukcja select zawiera funkcję join, group by lub funkcję agregującą.</li> <li>wiele instrukcji select jest łączonych za pomocą union.</li> <li>kolumna tożsamości znajduje się na liście wyboru więcej niż jeden raz.</li> <li>kolumna tożsamości jest częścią wyrażenia.</li> <li>kolumna tożsamości pochodzi ze zdalnego źródła danych.</li> </ul> <p>jeśli którykolwiek z tych warunków jest spełniony, kolumna jest tworzona nie null zamiast dziedziczenia właściwości tożsamość. jeśli w nowej tabeli wymagana jest kolumna tożsamości, ale taka kolumna nie jest dostępna lub chcesz mieć wartość początkową lub przyrostową inną niż kolumna tożsamości źródłowej, zdefiniuj kolumnę na liście wyboru za pomocą funkcji tożsamość. zobacz „tworzenie kolumny tożsamości za pomocą funkcji tożsamość” w sekcji przykłady poniżej.</p> </blockquote><p>więc ... teoretycznie można uciec:</p><pre><code>select id, val into copy\_from\_with\_id\_2 from with\_id union all select 0, 'test\_row' where 1 = 0; </code></pre><p>ważne byłoby skomentowanie tego kodu, aby go wyjaśnić, aby nie został usunięty następnym razem, gdy ktoś na niego spojrzy.</p> <p>spróbuj ustawić<strong> <em><code>user.language</code></em> </strong>i<strong> <em><code>user.country</code></em> </strong>properties w<strong> <em><code>sqldeveloper.conf</code></em> </strong>plik znajdujący się w <em>sqldeveloper folder bin</em> (<em><code>%appdata%\sqldeveloper\&lt;version&gt;\product.conf</code></em> dla nowszych wersji).<br/> przykład dla zestawu<strong> <em>francuski</em> </strong>język:</p><pre><code>includeconffile ../../ide/bin/ide.conf setjavahome d:\jdk1.6.0\_25 addvmoption -doracle.ide.util.addinpolicyutils.override\_flag=true addvmoption -dsun.java2d.ddoffscreen=false addvmoption -dwindows.shell.font.languages= addvmoption -duser.language=fr addvmoption -duser.country=fr addvmoption -xx:maxpermsize=128m addvmoption -doracle.jdbc.mapdatetotimestamp=false includeconffile sqldeveloper-nondebug.conf </code></pre><p>aby wyłączyć język, spróbuj usunąć jego obsługę, edytując<strong> <em><code>oracle.translated.locales</code></em> </strong>option w<strong> <em><code>ide.boot</code></em> </strong>file (znajdujący się w folderze ide).<br/> na przykład, jeśli chcę „złamać”<strong> <em>francuski</em> </strong>obsługa języka ta opcja będzie:</p><pre><code>oracle.translated.locales = de,es,it,ja,ko,pt\_br,zh\_cn,zh\_tw </code></pre><p>pierwotna wartość wynosiła:</p><pre><code>oracle.translated.locales = de,fr,es,it,ja,ko,pt\_br,zh\_cn,zh\_tw </code></pre><p>powyższa konfiguracja (plik sqldeveloper.conf) będzie błędna po usunięciu<strong> <em>french</em> </strong>support i<strong> <em>french</em> </strong>język nie pojawi się jako lokalizacja gui.</p> <p>oto wyniki zapytania tabeli w <strong>druga kolumna indeksu wielokolumnowego</strong>.<br> efekty są łatwe do odtworzenia dla każdego. po prostu spróbuj w domu.</p><p>testowałem z postgresql <strong>9.0.5</strong> na debianie, używając średniej wielkości tabeli bazy danych z 23322 wierszami. implementuje relację n: m między tabelami <code>adr</code> (adres) i <code>att</code> (atrybut), ale tutaj nie ma to znaczenia. uproszczony schemat:</p><pre><code>create table adratt ( adratt\_id serial primary key , adr\_id integer not null , att\_id integer not null , log\_up timestamp(0) not null default (now())::timestamp(0) , constraint adratt\_uni unique (adr\_id, att\_id) ); </code></pre><p>ograniczenie <code>unique</code> skutecznie implementuje unikalny indeks. dla pewności powtórzyłem test z prostym indeksem i uzyskałem identyczne wyniki, jak oczekiwano.</p><pre><code>create index adratt\_idx on adratt(adr\_id, att\_id) </code></pre><p>tabela jest skupiona w <code>adratt\_uni</code> indeks i przed testem uruchomiłem:</p><pre><code>cluster adratt; analyze adratt; </code></pre><p>skanowanie sekwencyjne w poszukiwaniu zapytań na <code>(adr\_id, att\_id)</code> są tak szybkie, jak to tylko możliwe. indeks wielokolumnowy będzie nadal używany jako warunek zapytania w samej drugiej kolumnie indeksu.</p><p>uruchomiłem zapytania kilka razy, aby zapełnić pamięć podręczną i wybrałem najlepszy z dziesięciu przebiegów, aby uzyskać porównywalne wyniki.</p><h2>1. zapytanie za pomocą obu kolumn</h2><pre><code>select * from adratt where att\_id = 90 and adr\_id = 10; adratt\_id | adr\_id | att\_id | log\_up +++ 123 | 10 | 90 | 2008-07-29 09:35:54 (1 row) </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>index scan using adratt\_uni on adratt (cost=0.00..3.48 rows=1 width=20) (actual time=0.022..0.025 rows=1 loops=1) index cond: ((adr\_id = 10) and (att\_id = 90)) total runtime: 0.067 ms </code></pre></blockquote><h2>2. zapytanie za pomocą pierwszej kolumny</h2><pre><code>select * from adratt where adr\_id = 10 adratt\_id | adr\_id | att\_id | log\_up +++ 126 | 10 | 10 | 2008-07-29 09:35:54 125 | 10 | 13 | 2008-07-29 09:35:54 4711 | 10 | 21 | 2008-07-29 09:35:54 29322 | 10 | 22 | 2011-06-06 15:50:38 29321 | 10 | 30 | 2011-06-06 15:47:17 124 | 10 | 62 | 2008-07-29 09:35:54 21913 | 10 | 78 | 2008-07-29 09:35:54 123 | 10 | 90 | 2008-07-29 09:35:54 28352 | 10 | 106 | 2010-11-22 12:37:50 (9 rows) </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>index scan using adratt\_uni on adratt (cost=0.00..8.23 rows=9 width=20) (actual time=0.007..0.023 rows=9 loops=1) index cond: (adr\_id = 10) total runtime: 0.058 ms </code></pre></blockquote><h2>3. zapytanie za pomocą drugiej kolumny</h2><pre><code>select * from adratt where att\_id = 90 adratt\_id | adr\_id | att\_id | log\_up +++ 123 | 10 | 90 | 2008-07-29 09:35:54 180 | 39 | 90 | 2008-08-29 15:46:07 ... (83 rows) </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>index scan using adratt\_uni on adratt (cost=0.00..818.51 rows=83 width=20) (actual time=0.014..0.694 rows=83 loops=1) index cond: (att\_id = 90) total runtime: 0.849 ms </code></pre></blockquote><h2>4. wyłącz indeksowanie i skanowanie bitmaps</h2><pre><code>set enable\_indexscan = off; select * from adratt where att\_id = 90 </code></pre><p>wynik analizy explain analyze:</p><blockquote> <pre><code>bitmap heap scan on adratt (cost=779.94..854.74 rows=83 width=20) (actual time=0.558..0.743 rows=83 loops=1) recheck cond: (att\_id = 90) -&gt; bitmap index scan on adratt\_uni (cost=0.00..779.86 rows=83 width=0) (actual time=0.544..0.544 rows=83 loops=1) index cond: (att\_id = 90) total runtime: 0.894 ms </code></pre></blockquote><pre><code>set enable\_bitmapscan = off select * from adratt where att\_id = 90 </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>seq scan on adratt (cost=0.00..1323.10 rows=83 width=20) (actual time=0.009..2.429 rows=83 loops=1) filter: (att\_id = 90) total runtime: 2.680 ms </code></pre></blockquote><h2>wniosek</h2><p>zgodnie z oczekiwaniami indeks wielokolumnowy służy do zapytania tylko w drugiej kolumnie.<br> zgodnie z oczekiwaniami jest mniej skuteczny, ale zapytanie jest nadal <strong>x szybsze</strong> niż bez indeksu.<br> po wyłączeniu skanowania indeksów planista zapytań wybiera skanowanie sterty map bitowych, które wykonuje prawie tak samo szybko. dopiero po wyłączeniu tego wraca do skanowania sekwencyjnego.</p> Często jest to realizowane za pomocą [„Data Driven Subskrypcje”](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , ale ta funkcja jest dostępna tylko w niektórych wersjach SQL: Enterprise i Business Intelligence, ale nie w standardzie.


Tak więc istnieje wiele twórczych obejścia. Ale nie lubię żadnego z nich, a wszystko to wymaga uczciwej trochę pracy poza SSRS.


Do obejścia widziałem to: Tworzenie subskrypcji, a następnie wyłączenie lub włączenie zadanie SQL, który wysyła subskrypcję (zidentyfikowanego przez GUID).


Tworzenie .exe .NET otoki do obsługi wysyłania wiadomości e-mail. Można go uruchomić kwerendę najpierw sprawdzić, ile zwracane są wiersze, a następnie w razie potrzeby wygenerować raport i umieścić go w wiadomości e-mail. <p>myślę, że w zapytaniu o milion rekordów musisz unikać rzeczy takich jak <code>outer joins</code>. sugeruję użycie <code>union all</code> zamiast <code>left join</code>. tak długo, jak myślę, że <code>cross apply</code> jest bardziej wydajny niż pod-zapytanie w klauzuli select, zmodyfikuję zapytanie napisane przez conarda frixa, co moim zdaniem jest poprawne.</p><p>teraz: kiedy zacząłem modyfikować zapytanie, zauważyłem, że masz klauzulę where: <code>joinedtable.wherecolumn in (1, 3)</code>. w takim przypadku, jeśli pole jest puste, warunek stanie się fałszywy. to dlaczego używasz left join podczas filtrowania wierszy o wartości zerowej? wystarczy zastąpić <code>left join</code> <code>inner join</code>, gwarantuję, że będzie szybciej.</p><p><strong>około indeks:</strong></p><p>pamiętaj, że jeśli masz indeks na stole, powiedzmy</p><pre><code>table1(a int, b nvarchar) </code></pre><p>a twój indeks to:</p><pre><code>nonclustered index ix1 on table1(a) </code></pre><p>i chcesz zrobić coś takiego:</p><pre><code>select a,b from table1 where a &lt; 10 </code></pre><p>w swoim indeksie nie uwzględniłeś kolumny <code>b</code>, więc co się stanie?</p><p>jeśli serwer sql używa twojego indeksu, będzie musiał przeszukać indeks o nazwie <strong>„index seek”</strong>, a następnie odwołać się do głównej tabeli, aby uzyskać kolumnę <code>b</code>, o nazwie <strong>„wyszukaj”</strong>. ta procedura może potrwać znacznie dłużej niż skanowanie samej tabeli: <strong>„skanowanie tabeli”</strong>.</p><p>ale w oparciu o statystyki serwera sql-serwer w takich sytuacjach może w ogóle nie używać twojego indeksu.</p><p>więc najpierw sprawdź <code>execution plan</code>, aby zobaczyć, czy indeks jest w ogóle używany.</p><p>jeśli tak lub nie oba, zmień indeks, aby uwzględnić wszystkie wybrane kolumny. powiedz jak:</p><pre><code>nonclustered index ix1 on table1(a) include(b) </code></pre><p>w takim przypadku wyszukiwanie nie będzie potrzebne, a zapytanie zostanie wykonane o wiele szybciej.</p> <p>uwaga: od wersji 12 bazy danych sql azure te ograniczenia nie mają już zastosowania.</p><p>nie ma czegoś takiego jak „indeks główny”. istnieje coś takiego jak „klucz podstawowy”, a także coś takiego jak „indeks klastrowany”. odrębne koncepcje, często mylone. mając na uwadze to rozróżnienie, przejdźmy ponownie do pytania:</p><p>p1) czy można zmodyfikować indeks klastrowy w tabeli sql azure?<br> a: tak. użyj <code>with (drop\_existing=on)</code>:</p><pre><code>create table friend ( userid int not null, id int not null); go create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>q2) czy można zmodyfikować indeks klastrowy tabeli z ograniczeniem klucza podstawowego?<br> odp .: tak, tak samo jak powyżej, o ile ograniczenie klucza podstawowego nie jest egzekwowane przez indeks klastrowany:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>p3) czy można zmodyfikować ograniczenie klucza podstawowego tabeli?<br> o: tak, dopóki podstawowe ograniczenie nie jest egzekwowane przez indeks klastrowany:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); go create clustered index cdxfriend on friend (userid, id); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key nonclustered (userid) go </code></pre><p>p4) czy klucz podstawowy tabeli może być modyfikowany, gdy jest egzekwowany przez indeks klastrowany?<br> odp .: tak, jeśli tabela nigdy nie miała żadnych wierszy:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key clustered (id, userid) go </code></pre><p>p5) czy klucz podstawowy tabeli można modyfikować, gdy jest wymuszany przez indeks klastrowany, jeśli tabela jest zapełniona?<br> o: nie. każda operacja, która przekształca zapełniony indeks klastrowany w stertę, zostanie zablokowana na sql azure, <em>, nawet jeśli tabela jest pusta </em>:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); delete from friend; go alter table friend drop constraint pk\_friend; </code></pre><p>na marginesie: ograniczenie można zmodyfikować, jeśli tabela jest <em> obcięta </em>.</p><p>obejściem problemu zmiany ograniczenia pk w zapełnionej tabeli jest zrobienie starego dobrego <a href="http://msdn.microsoft.com/en-us/library/ms188351.aspx"><code>sp\_rename</code></a> trick:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); go create table friendnew ( userid int not null, id int not null identity(1,1), constraint pk\_friend\_new primary key clustered (id, userid)); go set identity\_insert friendnew on; insert into friendnew (userid, id) select userid, id from friend; set identity\_insert friendnew off; go begin transaction exec sp\_rename 'friend', 'friendold'; exec sp\_rename 'friendnew', 'friend'; commit; go sp\_help 'friend'; </code></pre><p><code>sp\_rename</code> podejście ma pewne problemy, najważniejsze jest to, że uprawnienia do tabeli nie są przenoszone podczas zmiany nazwy, a także ograniczenia klucza obcego.</p> <p>możesz zbudować ciąg za pomocą widoków katalogu, np .:</p><pre><code>declare @sql nvarchar(max) = n''; select @sql += ' drop table ' + quotename(s.name) + '.' + quotename(t.name) + ';' from sys.tables as t inner join sys.schemas as s on t.[schema\_id] = s.[schema\_id] where t.name like 'lg\_001%'; print @sql; -- exec sp\_executesql @sql; </code></pre><p>oczywiście istnieją potencjalne luki, na przykład jeśli te tabele mają powiązania z kluczem obcym, musisz je najpierw usunąć lub ustawić wyniki tak, aby tabele były usuwane w określonej kolejności.</p><p>aby uzyskać listę tabel, użyj:</p><pre><code>select s.name, t.name from sys.tables as t inner join sys.schemas as s on t.[schema\_id] = s.[schema\_id] where t.name like 'lg\_001%'; </code></pre> <p>ma więcej kolumn niż pokaż status tabeli; ale robi sztuczkę:</p><pre><code>select * from information\_schema.tables where table\_schema = database(); </code></pre><p>aktualizacja 2011-06-07 19:02</p><pre><code>select table\_name,engine,version,row\_format,table\_rows,avg\_row\_length, data\_length,max\_data\_length,index\_length,data\_free,auto\_increment, create\_time,update\_time,check\_time,table\_collation,checksum, create\_options,table\_comment from information\_schema.tables where table\_schema = database(); </code></pre><p>te zapytania działają, jeśli ustawisz bieżącą bazę danych.</p><p>możesz także kodować konkretną bazę danych:</p><pre><code>select table\_name,engine,version,row\_format,table\_rows,avg\_row\_length, data\_length,max\_data\_length,index\_length,data\_free,auto\_increment, create\_time,update\_time,check\_time,table\_collation,checksum, create\_options,table\_comment from information\_schema.tables where table\_schema = 'mysql'; </code></pre>