Bases de datos

MySQL

Generación de script de tablas, llaves primarias y foráneas e índices

Última actualización: 23-10-2022 16:15

La unión de estos dos SELECTs da como resultado el listado de comandos de creación de tablas, llaves primarias y foráneas de la base de datos en que se ejecute.



SET SESSION group_concat_max_len = 100000000;
 
select XSQL 
from (
		-- COMANDOS SQL PARA CREACIÓN DE TABLAS
		select 10 as ROW_BLOCK, concat('create table ',
				z.TABLE_NAME, 
					' (', 
						GROUP_CONCAT(z.MSSQL_COLUMN_SCRIPT order by ORDINAL_POSITION separator ', '),
						case when y.PK_COLS is null then '' else concat(', primary key (', y.PK_COLS, ')') end,
						')',
 
                        case 
							when z.ENGINE is null then ''
                            else concat(' engine = ', z.ENGINE)
                        end,
                        case 
							when z.CHARACTER_SET_NAME is null then ''
                            else concat( ' DEFAULT CHARSET=', z.CHARACTER_SET_NAME)
						end ,                       
                        ';'
				) as XSQL					
		from (
				select a.TABLE_NAME, b.ORDINAL_POSITION, a.ENGINE,	c.CHARACTER_SET_NAME,				
						concat( b.COLUMN_NAME, 
								' ', b.COLUMN_TYPE,							
								case when b.EXTRA = 'auto_increment' then concat(' ', b.EXTRA) else '' end,
							case b.IS_NULLABLE when 'YES' then '' else ' not' end,
							' null',
 
 
                            case 
								when b.COLUMN_DEFAULT is null then ''
                                when trim(upper(b.COLUMN_DEFAULT)) = 'NULL' then ''
								else 
									concat( ' default ', 
									case upper(b.COLUMN_DEFAULT)
										when 'CURRENT_TIMESTAMP' then 'CURRENT_TIMESTAMP'
                                        when 'CURRENT_TIMESTAMP()' then 'CURRENT_TIMESTAMP()'
                                        else concat( "'",  replace(b.COLUMN_DEFAULT, "'", "") , "'")
 
									end
                                    )
							end
 
						) as MSSQL_COLUMN_SCRIPT
				from information_schema.tables a 
					inner join information_schema.columns b 
						on a.table_schema = database()
							and b.table_schema = database()
							and b.table_name = a.table_name
					left outer join INFORMATION_SCHEMA.CHARACTER_SETS c on c.default_collate_name = a.TABLE_COLLATION
				where a.TABLE_TYPE = 'BASE TABLE'
				order by a.TABLE_NAME, b.ORDINAL_POSITION			
			) z
			left outer join (
					select a.TABLE_NAME,  
							GROUP_CONCAT(
											b.COLUMN_NAME
											order by ifnull(b.ORDINAL_POSITION, 1) 
											separator ', '
										) as PK_COLS
					from information_schema.TABLE_CONSTRAINTS a
						inner join information_schema.KEY_COLUMN_USAGE b 
							on a.table_schema = database()
								and b.table_schema = database()
								and b.table_name = a.table_name
								and b.CONSTRAINT_NAME = a.CONSTRAINT_NAME
					where a.table_schema = database() 
						and a.CONSTRAINT_TYPE = 'PRIMARY KEY'
					group by a.TABLE_NAME	
				) y on y.TABLE_NAME = z.TABLE_NAME					
			group by z.TABLE_NAME
 
			union 
 
			-- COMANDOS SQL PARA CREACIÓN DE LLAVES FORÁNEAS
			select 20 as ROW_BLOCK, concat('alter table ', a.TABLE_NAME, ''
					' add constraint ', a.CONSTRAINT_NAME,
					' foreign key (', 
						group_concat(
							b.COLUMN_NAME
							order by ifnull(ORDINAL_POSITION, 0) 
							separator ', '
							), 
						')',
					' references `', b.REFERENCED_TABLE_NAME, '` (', 
						group_concat(
							concat('`', b.REFERENCED_COLUMN_NAME, '`') 
							order by ifnull(ORDINAL_POSITION, 0) 
							separator ', '
								), 
							')'
					, ';') as FK_SQL
			from information_schema.TABLE_CONSTRAINTS a
				inner join information_schema.KEY_COLUMN_USAGE b 
					on a.table_schema = database()
						and b.table_schema = database()
						and b.table_name = a.table_name
						and b.CONSTRAINT_NAME = a.CONSTRAINT_NAME
			where CONSTRAINT_TYPE = 'FOREIGN KEY'
			group by a.TABLE_NAME, a.CONSTRAINT_NAME
 
			union
 
			-- COMANDOS SQL PARA CREACIÓN DE ÍNDICES
			select 70, 	
				concat('create ',
						case a.NON_UNIQUE when 0 then ' unique' else '' end,
						' index ', a.INDEX_NAME, ' on ', a.TABLE_NAME, ' (', 
							GROUP_CONCAT(a.COLUMN_NAME order by a.SEQ_IN_INDEX separator ', '), 
						');') as XSQL 			
			from information_schema.STATISTICS a
				left outer join information_schema.TABLE_CONSTRAINTS b 
					on b.table_schema = database() 
							and b.TABLE_NAME = a.TABLE_NAME 
							and b.CONSTRAINT_NAME = a.INDEX_NAME 
							and b.CONSTRAINT_TYPE in ('PRIMARY KEY', 'FOREIGN KEY')
			where a.table_schema = database() 	
				and b.CONSTRAINT_NAME is null
			group by a.TABLE_NAME, a.INDEX_NAME, a.NON_UNIQUE
 
		) ft 
order by ROW_BLOCK;

 

Política de Privacidad

Última actualización: 23 de diciembre de 2024

 X 

Tu privacidad es importante para nosotros. En esta política de privacidad, explicamos qué información recopilamos cuando visitas nuestro sitio web y cómo utilizamos esa información.

1. Información que recopilamos

Este sitio no recopila información personal de los usuarios, excepto cuando un usuario elige voluntariamente comunicarse a través del formulario de contacto. En ese caso, los datos proporcionados (como tu nombre y correo electrónico) se utilizarán únicamente para responder a tu consulta.

2. Uso de Cookies

Este sitio web utiliza una única cookie esencial llamada PHPSESSID.

No usamos cookies de análisis ni de seguimiento.

3. Seguridad de los datos

Adoptamos medidas técnicas y organizativas razonables para proteger cualquier información que compartas con nosotros contra el acceso no autorizado, pérdida o alteración.

4. Enlaces a sitios de terceros

Nuestro sitio web puede contener enlaces a otros sitios web. No somos responsables de las prácticas de privacidad ni del contenido de dichos sitios.

5. Cambios en esta política de privacidad

Nos reservamos el derecho de actualizar esta política de privacidad en cualquier momento. Cualquier cambio será publicado en esta misma página e incluirá la fecha de la última actualización.

6. Contacto

Si tienes preguntas o inquietudes sobre esta política de privacidad, puedes comunicarte con nosotros a través de la página de contacto disponible en este sitio web.

7. Cumplimiento con Normativas Internacionales de Privacidad

Nuestro sitio web cumple con las principales regulaciones internacionales de protección de datos personales para garantizar la privacidad y seguridad de los usuarios. Esto incluye, pero no se limita a, las siguientes leyes:

Si tienes preguntas o dudas sobre el cumplimiento de estas leyes, no dudes en ponerte en contacto conmigo a través de la página de contacto de este sitio web.