更新影响0行

时间:2020-02-20 16:29:19

标签: mysql

我需要更新我的所有发票并重新生成每个发票的小计和总计。不幸的是,我在运行查询时返回了0个受影响的行,但我没有得到。没有返回MySQL错误,因此语法得以通过...但是,如您在转储中所见,该表不为空,并且应该根据FACTURE_ITEMS更新了sous_total和total

我的查询是:

UPDATE FACTURES f0 SET 
f0.sous_total=(
    SELECT SUM(f1.quantite*f1.prix) FROM FACTURES_ITEMS f1 WHERE f1.id_facture=f0.id
), 
f0.total= sous_total+(
        SELECT SUM(f2.taxes) FROM FACTURES_ITEMS f2 WHERE f2.id_facture=f0.id AND f2.taxable=1
)

我的2张桌子如下:

--
-- Table structure for table `FACTURES`
--

CREATE TABLE `FACTURES` (
  `id` int(10) UNSIGNED NOT NULL,
  `id_etablissement` int(10) UNSIGNED DEFAULT NULL,
  `id_evenement` int(10) UNSIGNED DEFAULT NULL,
  `id_demande` int(10) UNSIGNED DEFAULT NULL,
  `id_cotisation` int(10) UNSIGNED DEFAULT NULL,
  `id_facture_parent` int(10) UNSIGNED DEFAULT NULL,
  `numero_facture` int(9) NOT NULL,
  `personne_contact` varchar(255) NOT NULL,
  `courriel` varchar(60) NOT NULL,
  `nom` varchar(255) NOT NULL,
  `adresse` varchar(255) NOT NULL,
  `ville` varchar(255) NOT NULL,
  `province` varchar(35) DEFAULT NULL,
  `id_pays` int(10) UNSIGNED DEFAULT NULL,
  `code_postal` varchar(12) NOT NULL,
  `telephone` varchar(16) NOT NULL,
  `extension` varchar(25) DEFAULT NULL,
  `fax` varchar(16) NOT NULL,
  `id_statut` int(10) UNSIGNED NOT NULL,
  `passkey` varchar(255) NOT NULL,
  `creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `sous_total` decimal(10,2) NOT NULL,
  `total_tps` decimal(10,2) NOT NULL,
  `total_tvq` decimal(10,2) NOT NULL,
  `total` decimal(10,2) NOT NULL,
  `id_devise` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Dumping data for table `FACTURES`
--

INSERT INTO `FACTURES` (`id`, `id_etablissement`, `id_evenement`, `id_demande`, `id_cotisation`, `id_facture_parent`, `numero_facture`, `personne_contact`, `courriel`, `nom`, `adresse`, `ville`, `province`, `id_pays`, `code_postal`, `telephone`, `extension`, `fax`, `id_statut`, `passkey`, `creation`, `sous_total`, `total_tps`, `total_tvq`, `total`, `id_devise`) VALUES
(1, 1387, 1, NULL, NULL, NULL, 1, '***', '***', '***', '***', '***', '***', 124, '***', '***', NULL, '', 4, '***', '2020-02-20 15:19:42', 2500.00, 0.00, 0.00, 0.00, 1);

-- --------------------------------------------------------

--
-- Table structure for table `FACTURES_ITEMS`
--

CREATE TABLE `FACTURES_ITEMS` (
  `id` int(10) UNSIGNED NOT NULL,
  `id_facture` int(10) UNSIGNED NOT NULL,
  `id_inscription` int(10) UNSIGNED DEFAULT NULL,
  `titre` varchar(255) DEFAULT NULL,
  `quantite` int(11) NOT NULL,
  `prix` decimal(10,2) NOT NULL,
  `taxes` decimal(10,2) NOT NULL,
  `id_statut` tinyint(3) UNSIGNED DEFAULT NULL,
  `taxable` int(1) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Dumping data for table `FACTURES_ITEMS`
--

INSERT INTO `FACTURES_ITEMS` (`id`, `id_facture`, `id_inscription`, `titre`, `quantite`, `prix`, `taxes`, `id_statut`, `taxable`) VALUES
(1, 1, 1, NULL, 1, 500.00, 74.88, NULL, 1),
(2, 1, 2, NULL, 1, 500.00, 74.88, NULL, 1),
(3, 1, 3, NULL, 1, 500.00, 74.88, NULL, 1),
(4, 1, 4, NULL, 1, 500.00, 74.88, NULL, 1),
(5, 1, 5, NULL, 1, 500.00, 74.88, NULL, 1);

1 个答案:

答案 0 :(得分:1)

这是MySQL的独特之处,使某些人在第一次遇到它时就感到惊讶。

如果您设置的值已经是存储在这些行中的值,则“受影响的行0”为true。也就是说,如果数据没有净变化,则认为该数据不“受影响”。