---
title: Migracion SQL 9.1.0 — Cambios en Base de Datos
section: ps91
slug: sql-migration
description: "Documentacion completa del fichero SQL de migracion 9.1.0: nuevas tablas, feature flags, hooks y cambios de esquema."
last_updated: 2026-04
source_url: "https://ayudaprestashop.es/ps91/sql-migration"
---

# Migracion SQL 9.1.0 — Cambios en Base de Datos

> Documentacion completa del fichero SQL de migracion 9.1.0: nuevas tablas, feature flags, hooks y cambios de esquema.

## Resumen de cambios en la BD

La migracion SQL de PS 9.1.0 introduce **4 nuevas tablas**, modifica columnas existentes, registra **20 nuevos hooks**, elimina 2, e inserta datos iniciales para los nuevos sistemas. A continuacion se documenta cada cambio.

> **[!] Fichero fuente**
>
> El SQL completo esta en [autoupgrade/upgrade/sql/9.1.0.sql](https://github.com/PrestaShop/autoupgrade/blob/dev/upgrade/sql/9.1.0.sql) del repositorio oficial.

## Nuevos feature flags

*Feature flags insertados*

```sql
-- Nuevos feature flags (todos en estado beta, desactivados)
INSERT INTO `PREFIX_feature_flag` (name, state, label_wording, label_domain, description_wording, description_domain, stability)
VALUES
    ('improved_shipment', 0, 'Improved shipment', 'Admin.Shipping', 'Enable the improved shipment system', 'Admin.Shipping', 'beta'),
    ('discount', 0, 'Discount', 'Admin.Catalog', 'Enable the new discount system', 'Admin.Catalog', 'beta'),
    ('tag', 0, 'Tag', 'Admin.Catalog', 'Enable the new tag system', 'Admin.Catalog', 'beta');

-- Feature flag obsoleto eliminado
DELETE FROM `PREFIX_feature_flag` WHERE name = 'cart_rule';
```

## Tablas de Multi-Shipment

Dos nuevas tablas soportan el sistema de envios multiples:

*CREATE TABLE ps_shipment*

```sql
CREATE TABLE IF NOT EXISTS `PREFIX_shipment` (
    `id_shipment`             INT(10) NOT NULL AUTO_INCREMENT,
    `id_order`                INT(10) NOT NULL,
    `id_carrier`              INT(10) NOT NULL,
    `id_delivery_address`     INT(10) DEFAULT NULL,
    `shipping_cost_tax_excl`  NUMERIC(20,6) DEFAULT '0.000000',
    `shipping_cost_tax_incl`  NUMERIC(20,6) DEFAULT '0.000000',
    `packed_at`               DATETIME DEFAULT NULL,
    `shipped_at`              DATETIME DEFAULT NULL,
    `delivered_at`            DATETIME DEFAULT NULL,
    `cancelled_at`            DATETIME DEFAULT NULL,
    `tracking_number`         VARCHAR(255) DEFAULT NULL,
    `date_add`                DATETIME NOT NULL,
    `date_upd`                DATETIME NOT NULL,
    PRIMARY KEY (`id_shipment`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

*CREATE TABLE ps_shipment_product*

```sql
CREATE TABLE IF NOT EXISTS `PREFIX_shipment_product` (
    `id_shipment_product`   INT NOT NULL AUTO_INCREMENT,
    `id_shipment`           INT(10) NOT NULL,
    `id_order_detail`       INT(10) NOT NULL,
    `quantity`              INT(10) DEFAULT NULL,
    PRIMARY KEY (`id_shipment_product`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

## Tablas del sistema de descuentos

*CREATE TABLE ps_cart_rule_type*

```sql
CREATE TABLE IF NOT EXISTS `PREFIX_cart_rule_type` (
    `id_cart_rule_type`  INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `discount_type`      VARCHAR(128) NOT NULL,
    `is_core`            TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `active`             TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
    `date_add`           DATETIME NOT NULL,
    `date_upd`           DATETIME NOT NULL,
    PRIMARY KEY (`id_cart_rule_type`),
    UNIQUE KEY `discount_type` (`discount_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

*CREATE TABLE ps_cart_rule_type_lang*

```sql
CREATE TABLE IF NOT EXISTS `PREFIX_cart_rule_type_lang` (
    `id_cart_rule_type`  INT(10) UNSIGNED NOT NULL,
    `id_lang`            INT(10) UNSIGNED NOT NULL,
    `name`               VARCHAR(255) NOT NULL,
    `description`        TEXT DEFAULT NULL,
    PRIMARY KEY (`id_cart_rule_type`, `id_lang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

*CREATE TABLE ps_cart_rule_compatible_types*

```sql
CREATE TABLE IF NOT EXISTS `PREFIX_cart_rule_compatible_types` (
    `id_cart_rule`       INT(10) UNSIGNED NOT NULL,
    `id_cart_rule_type`  INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (`id_cart_rule`, `id_cart_rule_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

*Datos iniciales — 5 tipos de descuento core*

```sql
INSERT INTO `PREFIX_cart_rule_type` (name, is_core, active) VALUES
    ('free_shipping', 1, 1),
    ('cart_level',    1, 1),
    ('order_level',   1, 1),
    ('product_level', 1, 1),
    ('free_gift',     1, 1);
```

## Hooks registrados en SQL

La migracion inserta **21 nuevos hooks** en la tabla `ps_hook`:

*INSERT de nuevos hooks*

```sql
INSERT IGNORE INTO `PREFIX_hook` (name, title, description) VALUES
    -- Modulos
    ('actionModuleUpgradeAfter', 'After module upgrade', 'Triggered after successful module upgrade'),
    ('actionModuleEnable', 'After module enable', 'Triggered after module is enabled'),
    ('actionModuleDisable', 'After module disable', 'Triggered after module is disabled'),
    -- Configuracion
    ('actionConfigurationUpdateValueBefore', 'Before configuration update', 'Before Configuration::updateValue()'),
    -- Descuentos
    ('actionAdminDuplicateDiscountBefore', 'Before discount duplication', ''),
    ('actionAdminDuplicateDiscountAfter', 'After discount duplication', ''),
    ('actionDiscountGridDefinitionModifier', 'Discount grid definition', ''),
    ('actionDiscountGridQueryBuilderModifier', 'Discount grid query', ''),
    ('actionDiscountGridDataModifier', 'Discount grid data', ''),
    ('actionDiscountGridFilterFormModifier', 'Discount grid filters', ''),
    ('actionDiscountGridPresenterModifier', 'Discount grid presenter', ''),
    -- Tags
    ('actionTagFormBuilderModifier', 'Tag form builder', ''),
    ('actionTagFormDataProviderData', 'Tag form data', ''),
    ('actionTagFormDataProviderDefaultData', 'Tag form default data', ''),
    ('actionBeforeCreateTagFormHandler', 'Before tag creation', ''),
    ('actionAfterCreateTagFormHandler', 'After tag creation', ''),
    ('actionBeforeUpdateTagFormHandler', 'Before tag update', ''),
    ('actionAfterUpdateTagFormHandler', 'After tag update', ''),
    -- Envio
    ('actionOverrideShippingFreePrice', 'Override free shipping by price', ''),
    ('actionOverrideShippingFreeWeight', 'Override free shipping by weight', ''),
    -- Combinaciones
    ('actionUpdateDefaultCombinationAfter', 'After default combination update', ''),
    -- Hummingbird
    ('displayOrderDetail', 'Order detail display', ''),
    ('displayModalContent', 'Modal content', '');

-- Hooks ELIMINADOS
DELETE FROM `PREFIX_hook` WHERE name IN (
    'actionCartRuleFormDataProviderData',
    'actionCartRuleFormDataProviderDefaultData'
);
```

## Cambios en ps_cart_rule_product_rule

*Ampliacion del ENUM de tipo*

```sql
-- La columna 'type' de ps_cart_rule_product_rule se amplía
-- Valores anteriores: products, categories, attributes, manufacturers, suppliers
-- Nuevos valores añadidos: combinations, features
ALTER TABLE `PREFIX_cart_rule_product_rule`
    MODIFY `type` ENUM('products','categories','attributes','manufacturers','suppliers','combinations','features')
    NOT NULL;
```

## Limpieza de datos huerfanos

La migracion tambien ejecuta limpieza de datos huerfanos para mantener la integridad referencial:

*Limpieza de relaciones hook-modulo huerfanas*

```sql
-- Eliminar registros de hook_module que referencien hooks inexistentes
DELETE hm FROM `PREFIX_hook_module` hm
    LEFT JOIN `PREFIX_hook` h ON hm.id_hook = h.id_hook
    WHERE h.id_hook IS NULL;

-- Eliminar registros de hook_module_exceptions huerfanos
DELETE hme FROM `PREFIX_hook_module_exceptions` hme
    LEFT JOIN `PREFIX_hook` h ON hme.id_hook = h.id_hook
    WHERE h.id_hook IS NULL;
```


---

*Fuente: [https://ayudaprestashop.es/ps91/sql-migration](https://ayudaprestashop.es/ps91/sql-migration). Version Markdown generada automaticamente para consumo por LLMs.*
