sql >> Database teknologi >  >> RDS >> Mysql

Konverter MySQL-skema til Github Wiki?

Denne kode er ret lang. Jeg undskylder. Den består af to lagrede procedurer. Du kan være tilfreds med kun at køre den første. Den anden bruger output fra den første (de data, som den første efterlod i tabeller). Du kan også ønske at kombinere koden til én. Men jeg holdt dem adskilt. Den anden lagrede proc producerer output, der ligner beskriv min tabel . Men den udfører det for ALLE tabeller i databasen, du ønsker et sådant output.

Du bruger dette ved at sende en parameter (streng) som databasen skal rapportere om.

Jeg opretter en separat database, og koden refererer eksplicit til tabeller i den database ved navn. Så hvis du har EXECUTE privilegier til denne lagrede procedure, kan du køre den fra enhver aktuel database. Så, som en simpel test, skal du ikke indstille rapporteringsdatabasen som din nuværende database, og blot kalde den lagrede procedure ved navn (kvalificeret med rapporteringsdb-navn). Det hele er vist i testdelen nedenfor.

To lagrede procedurer

CREATE SCHEMA Reporting101a; -- Se **Note1**DROP PROCEDURE HVIS FINDER `Reporting101a`.`describeTables_v2a`;DELIMITER $$CREATE DEFINER=`root`@`localhost` PROCEDURE `Reporting101a`.`describeTables_v2a`(IN db0), - - dbnavnet til at rapportere tabelstrukturer OUT theSession int, -- OUT parameter for session# tildelt IN deleteSessionRows BOOL, -- sandt for sletning af rækker, når det er udført fra hovedrapporteringstabel for denne session# IN callTheSecondStoredProc BOOL -- TRUE =output er fra Pretty output i Second Stored Proc. FALSK=ikke så smukt output)BEGYND ERKLÆR denne tabel CHAR(100); DROP MIDLERTIDIG TABEL HVIS FINDER Rapportering101a.tOutput; OPRET MIDLERTIDIG TABEL Reporting101a.tOutput ( id int auto_increment primærnøgle, tblName varchar(100) ikke null, ordVal int ikke null, cField varchar(100) ikke null, cType varchar(100) ikke null, cNull varchar(100) null cKey varchar(100) ikke null, cStandard varchar(100) null, cExtra varchar(100) null ); DROP MIDLERTIDIG TABEL HVIS FINDER Rapportering101a.tOutput2; OPRET MIDLERTIDIG TABEL Rapportering101a.tOutput2 ( tblName varchar(100) primærnøgle, colCount int not null, cFieldMaxLen int not null, cTypeMaxLen int not null, cNullMaxLen int not null, cKeyMaxLen intault intMaxLen intf notMaxNull, cDef notMaxLen int; INSERT Reporting101a.tOutput(tblName,ordVal,cField,cType,cNull,cKey,cDefault,cExtra) SELECT TABLE_NAME,ORDINAL_POSITION,COLUMN_NAME AS Felt, COLUMN_TYPE AS TYPE, RPAD(IS_NULLABLE,RPAD(IS_NULLABLE,RPAD) COLUMN_KEY,3,' ') SOM 'Nøgle',RPAD(COLUMN_DEFAULT,7,' ') SOM 'DEFAULT',EKSTRA SOM Ekstra FRA informationsskema.kolonner WHERE tabelskema =dbNavn ORDER BY table_name,ordinal_position; -- vælg * fra information_schema.columns WHERE table_schema ='57security' rækkefølge efter tabelnavn, ordinær_position; OPDATERING Reporting101a.tOutput SET cExtra=' ' WHERE cExtra=''; UPDATE Reporting101a.tOutput SET cField=RPAD(cField,5,' ') WHERE LENGTH(cField)<5; INSERT Reporting101a.tOutput2(tblName,colCount,cFieldMaxLen,cTypeMaxLen,cNullMaxLen,cKeyMaxLen,cDefaultMaxLen,cExtraMaxLen) SELECT tblName,COUNT(*),0,0,0,0,0,0,0BY Reporting;FROM. OPDATERING tilOutput2 t2 JOIN ( SELECT tblName,MAX(LENGTH(cField)) AS mField,MAX(LENGTH(cType)) AS mType,MAX(LENGTH(cNull)) AS mNull, IFNULL(MAX(LENGTH(cKey)),0) AS mKey,IFNULL(MAX(LENGTH(cDefault)),0) AS mDefault,IFNULL(MAX(LENGTH(cExtra)),0) AS mExtra FROM Reporting101a.tOutput GROUP BY tblName ) x ON x.tblName=t2.tblName SET t2.cFieldMaxLen=x.mField,t2.cTypeMaxLen=x.mType,cNullMaxLen=x.mNull, cKeyMaxLen=x.mKey,cDefaultMaxLen=x.mDefault,cExtraMaxLen=x.mExtra; -- DROP TABLE Reporting101a.reportDataDefsSession; -- nyttigt til hurtig ændring af tabellens struktur -- bemærk, hold ovenstående drop call remed out ! Bare brug det til hurtige justeringer for at strukturere OPRET TABEL, HVIS IKKE FINDER Reporting101a.reportDataDefsSession (-- med det ene formål med sikker session auto_inc-brug - Slet venligst ikke, medmindre du ønsker, at sessionerne skal opleve afvigende adfærd sessionId INT AUTO_INCREMENT PRIMARY KEY, dummy CHAR(1) NOT NULL, creationDT datetime not null ); OPRET TABEL, HVIS IKKE FINDER Reporting101a.reportDataDefs ( sessionId INT NOT NULL, tblName VARCHAR(100) NOT NULL, -- Tabelnavn ordVal INT NOT NULL, -- "positionsnummeret" i kolonnen cField VARCHAR(100, -- NOT NULL) Kolonnen cType VARCHAR(100) NOT NULL, -- Datatype cNull VARCHAR(100) NOT NULL, -- Nullability cNøgle VARCHAR(100) NOT NULL, -- Nøgleoplysninger cStandard VARCHAR(100) NULL, -- Standardværdi cEkstra VARCHAR( 100) NULL, -- Ekstra output colCount INT NOT NULL, -- kolonnerne her og nedenfor er de-normalisere data cFieldMaxLen INT NOT NULL, cTypeMaxLen INT NOT NULL, cNullMaxLen INT NOT NULL, cKeyMaxLen INT NOT NULL, cDefault NOT NULL, cExtraMaxLen INT IKKE NULL ); -- I mangel af et bedre begreb kalder vi opkald for "sessioner". Programmøren kalder -- First Stored Proc, og vi kalder det en session, efter at vi har fået et unikt næste stigende nummer. -- Det nummer er sessionsnummeret. Indeslut alt output med det som en kolonneværdi. Dette giver os mulighed for -- at flytte mellem lagrede processer, have sikkert output, have historiske snapshots og beholde dataene -- via en session # til senere brug, uanset brug. INSERT Reporting101a.reportDataDefsSession(dummy,creationDT) VALUES ('X',nu()); SET @mySession=LAST_INSERT_ID(); -- der er den, vores session # (læs ovenstående afsnit) INSERT Reporting101a.reportDataDefs(sessionId,tblName,ordVal,cField,cType,cNull,cKey,cDefault,cExtra, colCount,cFieldMaxLen,cTypeMaxLen,cNullKeyMaxLen,cNulKeyMaxLen,cNulKeyMaxLen, cExtraMaxLen) VÆLG @mySession,t1.tblName,t1.ordVal,t1.cField,t1.cType,t1.cNull,t1.cKey,t1.cDefault,t1.cExtra, t2.colCount,t2.cFieldMaxLen,t2.cType t2.cNullMaxLen,t2.cKeyMaxLen,t2.cDefaultMaxLen,t2.cExtraMaxLen FRA Reporting101a.tOutput t1 JOIN Reporting101a.tOutput2 t2 PÅ t2.tblName=t1.tblName t1.tbl Name t.bl Name t.bl Name t. DROP MIDLERTIDIG TABEL Rapportering101a.tilOutput; DROP MIDLERTIDIG TABEL Rapportering101a.tilOutput2; SET [email protected]
; -- OUT-varen, der kom ind som en parameter -- **************************************** **************************************** -- ********** ************************************************** *************** -- Etiket "Some_Sort_of_Output":HVIS callTheSecondStoredProc=SAND SÅ -- Opkalderen siger, at han skal kalde den anden lagrede proc (til Pretty Printing) -- Dette vil generere output lignende to `DESCRIBE myTable` -- Men husk, det vil gøre det for HVER tabel i refereret database CALL Reporting101a.`Print_Tables_Like_Describe`(@mySession); -- Ovenstående opkald gav dig lige output. ELSE -- Den, der ringer, valgte ikke automatisk at kalde Pretty Printing anden lagrede procedure. -- Bemærk, den, der ringer op, kan nemt kalde den lige efter at have brugt OUT-parameteren. -- Så vores output vil være et resultatsæt af rapportDataDefs-tabel for denne session # SELECT * FROM Reporting101a.reportDataDefs HVOR [email protected]
 BESTIL EFTER tblName,ordVal; AFSLUT HVIS; -- ************************************************** ************************* -- ******************** ************************************************** ****HVIS deleteSessionRows=SAND SÅ -- Opkalderen siger, at outputrækker IKKE er nødvendige på dette tidspunkt. Slet dem. -- Bemærk, hvis denne boolean kommer i TRUE, kan du ikke kalde Pretty Printing -- anden lagret procedure med session #, fordi dataene er væk. --- Uanset hvad får du noget tilbage fra "Some_Sort_of_Output" ovenfor. SLET FRA Reporting101a.reportDataDefs HVOR curTable THEN IF bFirst=FALSE THEN INSERT Reporting101a.reportOutput(sessionId,lineOut) SELECT pSessionId,''; ELSE SET bFirst=FALSK; AFSLUT HVIS; INSERT Reporting101a.reportOutput(sessionId,lineOut) SELECT pSessionId,lv_tblName; INSERT Reporting101a.reportOutput(sessionId,lineOut) SELECT pSessionId,CONCAT('+-', REPEAT('-',GREATEST(5,lv_cFieldMaxLen)), '-+-', REPEAT('-',GREATEST(4,lv_cTypeMax )), '-+-', REPEAT('-',GREATEST(4,lv_cNullMaxLen)), '-+-', REPEAT('-',GREATEST(3,lv_cKeyMaxLen)), '-+-', REPEAT ('-',GREATEST(7,lv_cDefaultMaxLen)), '-+-', REPEAT('-',GREATEST(5,lv_cExtraMaxLen)), '-+'); SET @dashLineNumRow=LAST_INSERT_ID(); INSERT Reporting101a.reportOutput(sessionId,lineOut) SELECT pSessionId,CONCAT('| ', 'Field', REPEAT(' ',GREATEST(0,lv_cFieldMaxLen-5)), ' | ', 'Type', REPEAT(' ', GREATEST(0,lv_cTypeMaxLen-4)), ' | ', 'Null', REPEAT(' ',GREATEST(0,lv_cNullMaxLen-4)), ' | ', 'Nøgle', REPEAT(' ', STØRSTE(0, lv_cKeyMaxLen-3)), ' | ', 'Standard', REPEAT(' ',GREATEST(0,lv_cDefaultMaxLen-7)), ' | ', 'Extra', REPEAT(' ',GREATEST(0,lv_cExtraMaxLen-5) ), ' |'); INSERT Reporting101a.reportOutput(sessionId,lineOut) SELECT pSessionId,lineOut FROM Reporting101a.reportOutput WHERE example@sqldat .com
; -- SELECT * FROM Reporting101a.reportDataDefs WHERE sessionId=24; SET curTable=lv_tblName; AFSLUT HVIS; INSERT Reporting101a.reportOutput(sessionId,lineOut) SELECT pSessionId, CONCAT('| ', COALESCE(lv_cField,''), COALESCE(REPEAT(' ',GREATEST(0,lv_cFieldMaxLen-LENGTH(lv_cField),''),' ' | ', COALESCE(lv_cType,''), COALESCE(REPEAT(' ',GREATEST(0,lv_cTypeMaxLen-LENGTH(lv_cType))),''),' | ', COALESCE(lv_cNull,''), COALESCE( REPEAT(' ',GREATEST(0,lv_cNullMaxLen-LENGTH(lv_cNull))),''),' | ', COALESCE(lv_cKey,' '), COALESCE(REPEAT(' ',GREATEST(0,lv_cKeyMaxLen-LENGTH(lv_cKey ))),''),' | ', COALESCE(lv_cDefault,' '), COALESCE(REPEAT(' ',GREATEST(0,lv_cDefaultMaxLen-LENGTH(lv_cDefault))),''),' | ', COALESCE( lv_cExtra,' '), COALESCE(REPEAT(' ',STØRST(0,lv_cExtraMaxLen-LENGTH(lv_cExtra))),''),' |'); INSERT Reporting101a.reportOutput(sessionId,lineOut) SELECT pSessionId,lineOut FROM Reporting101a.reportOutput WHERE example@sqldat .com
; ENDSLØKKE; LUK cur1; vælg lineOut som '' fra Reporting101a.reportOutput hvor sessionId=pSessionId sorteres efter lineNum;END$$DELIMITER; 

Test

Test:

-- Se **Note2**SET @theOutVar =-1; -- En variabel, der bruges som OUT-variabelen nedenfor-- Se **Note3**-- Bemærk:med 'TRUE' som den 4. parameter, er dette en aftale med ét opkald. Det betyder, at du er færdig.call Reporting101a.describeTables_v2a('stackoverflow',@theOutVar,false,true);-- Se **Note4**-- Primært brugt, hvis den 4. parameter ovenfor er falsecall Reporting101a.Print_Tables_Like_Describe(@theOutVar); -- indlæser data for smukkere resultater i chunk-format. 

Output

+------------------------------------------------ ----------------------------------------------------------+ | |+------------------------------------------------ --------------------------------------------+| kursus || +------------+--------------+------+-----+-------- -+----------------+ || | Felt | Skriv | Nul | Nøgle | Standard | Ekstra | || +------------+--------------+------+-----+-------- -+----------------+ || | kursusId | int(11) | NEJ | PRI | | auto_increment | || +------------+--------------+------+-----+-------- -+----------------+ || | deptId | int(11) | NEJ | MUL | | | || +------------+--------------+------+-----+-------- -+----------------+ || | kursusnavn | varchar(100) | NEJ | | | | || +------------+--------------+------+-----+-------- -+----------------+ || || afd || +-----------+---------------+------+-----+--------+ ----------------+ || | Felt | Skriv | Nul | Nøgle | Standard | Ekstra | || +-----------+---------------+------+-----+--------+ ----------------+ || | deptId | int(11) | NEJ | PRI | | auto_increment | || +-----------+---------------+------+-----+--------+ ----------------+ || | afd.Navn | varchar(100) | NEJ | | | | || +-----------+---------------+------+-----+--------+ ----------------+ || || sammenkædning || +------------+---------+------+-----+--------+--- -------------+ || | Felt | Skriv | Nul | Nøgle | Standard | Ekstra | || +------------+---------+------+-----+--------+--- -------------+ || | id | int(11) | NEJ | PRI | | auto_increment | || +------------+---------+------+-----+--------+--- -------------+ || | studentId | int(11) | NEJ | MUL | | | || +------------+---------+------+-----+--------+--- -------------+ || | kursusId | int(11) | NEJ | MUL | | | || +------------+---------+------+-----+--------+--- -------------+ || | sigt | int(11) | NEJ | | | | || +------------+---------+------+-----+--------+--- -------------+ || | fremmøde | int(11) | NEJ | | | | || +------------+---------+------+-----+--------+--- -------------+ || | karakter | int(11) | NEJ | | | | || +------------+---------+------+-----+--------+--- -------------+ || || studerende || +------------+--------------+------+------+---- +----------------+ || | Felt | Skriv | Nul | Nøgle | Standard | Ekstra | || +------------+--------------+------+------+---- +----------------+ || | studentId | int(11) | NEJ | PRI | | auto_increment | || +------------+--------------+------+------+---- +----------------+ || | fulde navn | varchar(100) | NEJ | | | | || +------------+--------------+------+------+---- +----------------+ || || testtabel || +----------------------------------------+------ ----+------+-----+---------+-------+ || | Felt | Skriv | Nul | Nøgle | Standard | Ekstra | || +----------------------------------------+------ ----+------+-----+---------+-------+ || | ingenPKhere | int(11) | NEJ | | | | || +----------------------------------------+------ ----+------+-----+---------+-------+ || | veryLongColumnName_And_Then.Some_%_More | decimal(12,2) | JA | | | | || +----------------------------------------+------ ----+------+-----+---------+-------+ || | grænse | int(11) | NEJ | | | | || +----------------------------------------+------ ----+------+-----+---------+-------+ || || testtabel2 || +-------+---------+------+-----+--------+-------+ || | Felt | Skriv | Nul | Nøgle | Standard | Ekstra | || +-------+---------+------+-----+--------+-------+ || | id | int(11) | NEJ | PRI | | | || +-------+---------+------+-----+--------+-------+ |+------------------------------------------------ --------------------------------------------+

Bemærkning 1 :En database kaldet Reporting101a er oprettet til at rumme to lagrede procedurer og nogle støttetabeller. Disse rutiner starter med et opkald til en lagret procedure, der henviser til databasen der skal rapporteres på ved brug af en streng.

Dataene til at producere output er tilgået gennem den særlige INFORMATION_SCHEMA database på en SKRIVE-beskyttet måde. Derfor bliver den database, der rapporteres om, ikke rørt.

Der er tre ikke-midlertidige tabeller i denne database.

  1. reportDataDefsSession - En simpel tabel, der bruges til at få en session#
  2. reportDataDefs - data returneres fra INFORMATION_SCHEMA og masserede lidt. Det er sessionsbaseret.
  3. rapportOutput - En tabel til udskrivning som MySQL's DESCRIBE . Det er kun en tabel til at sætte output sammen. Det er sessionsbaseret.

Bemærkning 2 :Denne INT variabel er inkluderet som en OUT parametermål, skrevet til, og giver dig mulighed for at kile din anden kode ind, efter at den første lagrede procedure forbereder dataene. Det repræsenterer en session #, der isolerer outputtet til senere rapportering.

Nogle miljøer såsom PHP har visse tricks, der gør dette til en show-stopper for nogle programmører. Så hvis du har brug for at kombinere begge lagrede procedurer på egen hånd, så gør det (eller bed mig om det separat, hvis du er forvirret).

Under alle omstændigheder viser det, hvordan data eller indsatser kan Chain Together lagrede procedure kalder.

Helt ærligt en af ​​hovedårsagerne til, at jeg kommer ud med en session # som en OUT-parameter, er, at jeg ved, at jeg skal oprette en CURSOR for at få det smukke output. Og det kræver en Cursor DECLARE øverst i en anden lagret procedure. Og DECLARE s skal forekomme øverst i en lagret procedure. Så med bundne hænder gik jeg denne vej.

Bemærkning 3 :Dette er opkaldet til den første lagrede procedure. Det er højst sandsynligt, at du vil være færdig efter dette opkald med TRUE som din 4. parameter. Den lagrede procedure er ret godt dokumenteret inde i den. Den 3. parameter er for, om du vil have data slettet fra rapporteringstabellen for session #. Sletningen sker efter ethvert output som et resultatsæt. Så det afhænger af dit valg.

Parametre:

  1. databasenavnet til at beskrive alle tabeller som describe myTable
  2. INT UD parameter for at holde session #
  3. boolesk:vil du have data slettet fra rapporteringstabellen til sidst
  4. boolesk:skal vi automatisk kalde den smukke udskrivning lagrede procedure, der genererer beskriv -lignende output. Hvis du beslutter dig for at sende parameter 4 som FALSE , så kan dit output ligne dette:

Bemærkning 4 :Bruges i tilfælde, hvor du ønsker et andet output, men vil have session # at arbejde med. Du har typisk ikke brug for dette.



  1. ORA-12514 fejl efter genstart af serveren

  2. Sådan pivoterer du dynamisk med dato som kolonne

  3. MySQL vs MySQLi, når du bruger PHP

  4. GROUP BY / aggregeret funktionsforvirring i SQL