Cómo determinar si una columna está sin firmar?
-
11-12-2019 - |
Pregunta
Actualmente estoy tratando de lista de todas las columnas de una tabla específica y determinar si cada columna no está firmado o no.
Aquí un ejemplo de mi montura de prueba:
CREATE TABLE ttypes
(
cbiginteger BIGINT UNSIGNED,
cinteger INT UNSIGNED,
csmallinteger SMALLINT UNSIGNED
) ENGINE = InnoDB;
En orden a la lista de todas las columnas de una tabla específica, he encontrado dos posibilidades:
SHOW FULL COLUMNS
FROM ttypes;
De acuerdo a la documentación, esta consulta devuelve los campos siguientes:Campo Tipo Nulo Predeterminado, Extra Y Comentarios.Ninguno de ellos me permite determinar si una columna no está firmado o no.
Después de eso, miro el information_schema.columns
que es la base de la tabla utilizada por la SHOW COLUMNS
consulta.
SELECT ...
FROM information_schema.columns
WHERE table_name = 'ttypes';
Por desgracia, ninguno de los campos de resultado me permite determinar si una columna no está firmado o no.
Solución
Hasta donde yo sé, el único lugar en que los atributos se almacenan en COLUMN_TYPE
en INFORMATION_SCHEMA.COLUMNS
.
Que debe ser incluido en la salida de SHOW COLUMNS
(dentro de 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)
Por desgracia, se tendría que analizar el contenido de Type
y encontrar unsigned
, o no unsigned
allí - no ponga nada en para firma de columnas.
Otros consejos
Pruebe esta 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'
Salida
COLUMN_NAME COLUMN_TYPE IS_NULLABLE IS_UNSIGNED
----------- ---------------- ----------- -----------
id int(10) unsigned NO YES
recordID varchar(255) YES NO
Para determinar el tipo para todas las variables en una tabla puede ejecutar una consulta como esta:
select COLUMN_NAME,COLUMN_TYPE from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%'
Después de eso, puede determinar fácilmente el tipo para una variable específica (por ejemplo, el cinterador) con una consulta como esta:
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%' and COLUMN_NAME LIKE 'cinteger'
El código anterior devolverá el nombre de la variable seleccionada solo si está sin firmar.
Por fin, su puede usar un bucle MySQL, un procedimiento o su idioma de scripting favorito para usar este resultado y / o continúe buscando otras variables.
En caso de que alguien se tropieza con esto para el controlador MySQL en .NET, usando GetSchema () como yo, aquí es la información que no está disponible.
_connection.GetSchema("Columns")
y luego:
Espero que esto no esté completamente fuera de lugar para la pregunta, y ayuda a alguien que busca determinar programáticamente el signo.