Come determinare se una colonna non è firmata?
-
11-12-2019 - |
Domanda
Attualmente sto provando a elencare tutte le colonne di una tabella specifica e determinare se ogni colonna non è firmata o meno.
Qui, un esempio del mio dispositivo di prova:
CREATE TABLE ttypes
(
cbiginteger BIGINT UNSIGNED,
cinteger INT UNSIGNED,
csmallinteger SMALLINT UNSIGNED
) ENGINE = InnoDB;
.
Per elencare tutte le colonne di una tabella specifica, ho trovato due possibilità:
SHOW FULL COLUMNS
FROM ttypes;
.
Secondo il Documentazione , questa query ritornaQuesti campi: campo, tipo, null, default, extra e commento.Nessuno di loro mi consente di determinare se una colonna non è firmata o meno.
Dopo di ciò, guardo il information_schema.columns
che è la tabella di base utilizzata dalla query SHOW COLUMNS
.
SELECT ...
FROM information_schema.columns
WHERE table_name = 'ttypes';
.
Sfortunatamente, nessuno dei campi di risultato mi consente di determinare se una colonna non è firmata o meno.
Soluzione
Per quanto posso dire, l'unico posto in cui gli attributi sono memorizzati è in COLUMN_TYPE
in INFORMATION_SCHEMA.COLUMNS
.
che dovrebbe essere incluso nell'output da SHOW COLUMNS
(all'interno di Type
):
mysql> show columns from ttypes;
+---------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+----------------------+------+-----+---------+-------+
| cbiginteger | bigint(20) unsigned | YES | | NULL | |
| cinteger | int(10) unsigned | YES | | NULL | |
| csmallinteger | smallint(5) unsigned | YES | | NULL | |
+---------------+----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
.
Purtroppo dovresti analizzare il contenuto di Type
e trovare unsigned
, o non unsigned
in là - non mette nulla in colonne firmate.
Altri suggerimenti
Prova questa magia:
select COLUMN_NAME,
COLUMN_TYPE,
IS_NULLABLE,
IF(COLUMN_TYPE LIKE '%unsigned', 'YES', 'NO') as IS_UNSIGNED
from information_schema.COLUMNS where TABLE_NAME='record1'
.
output
COLUMN_NAME COLUMN_TYPE IS_NULLABLE IS_UNSIGNED
----------- ---------------- ----------- -----------
id int(10) unsigned NO YES
recordID varchar(255) YES NO
. Per determinare il tipo per tutte le variabili in una tabella è possibile eseguire una query come questa:
select COLUMN_NAME,COLUMN_TYPE from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%'
.
Dopo che il tuo può determinare facilmente il tipo per una variabile specifica (ad esempio il cinterger) con una query come questa:
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%' and COLUMN_NAME LIKE 'cinteger'
.
Il codice sopra riportato restituirà il nome della variabile cercata solo se non è firmata.
Alla fine la tua può utilizzare un loop mySQL, una procedura o il tuo linguaggio di scripting preferito per utilizzare questo risultato e / o continuare a cercare altre variabili.
Nel caso in cui qualcuno inciampa su questo per il driver MySQL in .NET, usando Gestchema () come me, ecco come è disponibile le informazioni senza firma.
_connection.GetSchema("Columns")
.
E poi:
Spero che questo non sia completamente fuori luogo per la domanda e aiuta qualcuno a cercare a livello programmatico determinando il segno.